diff options
Diffstat (limited to 'doc/ref/guile/datetime.texi')
-rw-r--r-- | doc/ref/guile/datetime.texi | 670 |
1 files changed, 0 insertions, 670 deletions
diff --git a/doc/ref/guile/datetime.texi b/doc/ref/guile/datetime.texi deleted file mode 100644 index 037ac8d5..00000000 --- a/doc/ref/guile/datetime.texi +++ /dev/null @@ -1,670 +0,0 @@ -@node Datetime -@section Datetime - -My datetime library, with focus on date manipulation in ways sensible -for humans. So that a date-time plus one day always keep the time of -day. -For example, 26 mars 2022 10:00 plus 1 day would give 27 mars 2022 -10:00, even though 25 hours have passed due to summer time starting -(in Sweden). - -Note that while some of these procedures mentions timezones, almost -nothing is actually done with it. - -@subsection Constants - -@defvar jan -@defvarx january -@defvarx feb -@defvarx february -@defvarx mar -@defvarx mars -@defvarx apr -@defvarx april -@defvarx may -@defvarx jun -@defvarx june -@defvarx jul -@defvarx july -@defvarx aug -@defvarx august -@defvarx sep -@defvarx september -@defvarx oct -@defvarx october -@defvarx nov -@defvarx november -@defvarx dec -@defvarx december -Numeric constants for all months. -@code{@var{jan} = 1}, @code{@var{dec} = 12}. -@end defvar - -@defvar sun -@defvarx sunday -@defvarx mon -@defvarx monday -@defvarx tue -@defvarx tuesday -@defvarx wed -@defvarx wednesday -@defvarx thu -@defvarx thursday -@defvarx fri -@defvarx friday -@defvarx sat -@defvarx saturday -@anchor{sunday} -Numeric constants for all weekdays. -@code{@var{sunday} = 0}, @code{@var{saturday} = 6}. -@end defvar - -@subsection Parameters and Configuration - -@deftp {parameter} week-start -@anchor{week-start} -Which weekday should be considered the first. Used for calculating -week numbers, the start dates of week, and is available for UI-code -and the like which wants it. -@end deftp - -@deftp {config} week-start -Configuration item, updates @xref{week-start}. -@end deftp - - -@subsection Datatypes - -@deftp {Immutable Record} <date> year month day -Object representing a date, without any timezone information. -Given the date 2040-03-23 (in ISO-8601 format), @var{year} = 2020, -@var{month} = 3 and @var{day} = 23. - -Values higher than those usually used are possible, but not recommended. - -@defun date? x -Is @var{x} a date object? -@end defun - -@defun date [#:year=0] [#:month=0] [#:day=0] -Create a new date object. -@end defun - -@defun year <date> -@defunx month <date> -@defunx day <date> -Fetch corresponding field from the date object. -@end defun -@end deftp - -@deftp {Immutable Record} <time> hour minute second -Object representing a timestamp in a given day, -without any timezone information. -Given the time 10:20:30, @var{hour} = 10, -@var{minute} = 20 and @var{second} = 30. - -Values larger than the ``regular'' are allowed, and useful since this -type is also used for time offsets. - -@defun time? x -Is @var{x} a time object? -@end defun - -@defun time [#:hour=0] [#:minute=0] [#:second=0] -Create a new time object. -@end defun - -@defun hour <time> -@defunx minute <time> -@defunx second <time> -Fetch corresponding field from the time object. -@end defun -@end deftp - - -@deftp {Immutable Record} <datetime> date time tz - -A collation of date and time, along with an optional timezone. -Set @code{tz = #f} if a timezone is not desired. - -@defun datetime? x -Is @var{x} a datetime object? -@end defun - -@defun datetime [#:date] [#:time] [#:tz] [#:year=0] [#:month=0] [#:day=0] [#:hour=0] [#:minute=0] [#:second=0] -Creates a new <datetime>. If @var{date} or @var{time} is given, those -are used. Otherwise, a date object is created from @var{year}, -@var{month} and @var{day}, and time is respectively created from -@var{hour}, @var{minute} and @var{second}. -@end defun - -@defun get-date -@defunx get-timezone -Note that @code{get-time} doesn't exists. -@end defun -@end deftp - - -@subsection Reader Extensions - -This module registers reader extensions on @code{#0}, @code{#1}, and -@code{#2}. These read either dates, times, or datetimes; using @code{string->date/-time}. - -@c @subsection CTIME - -@c These procedures are for interfacing with C's time procedures, see CTIME(3). - -@c The datetime<->tm procedures are internal, since they are slightly -@c unstable (see comments in code). -@c They are thereby not documented. -@c @defun datetime->tm datetime -@c Convert a @code{<datetime>} object to a @code{struct tm}, encoded in a -@c scheme vector. -@c @end defun -@c -@c @defun tm->datetime tm -@c Converts a @code{struct tm}, as returned from @code{datetime->tm} back -@c into a @code{<datetime>} object. -@c @end defun - -@subsection Procedures - -@defun datetime->unix-time datetime -Converts @var{datetime} to an integer representing its unix time. -@end defun - -@defun unix-time->datetime n -Converts a given unix timestamp to a datetime object. -Currently forces the timezone to be UTC. -@end defun - -@defun current-datetime -Return a datetime object of the current date and time. -Currently always returns it in UTC. -@end defun - -@defun current-date -Get the date component from a call to @code{current-datetime}. -@end defun - - -@defun get-datetime datetime -Takes a datetime in any timezone, and renormalize it to local time (as -defined by the environment variable TZ). This means that given UTC -10:00 new years day would return 11:00 new years day if ran in sweden. -@end defun - - -@defun as-date date/-time -@defunx as-time date/-time -Both procedures takes a <date>, <time>, or <datetime>, and return -respectively a <date> or <time> object. - -@code{as-date}, when given a time will return a zeroed date object. -Vice versa for @code{as-time}. -@end defun - -@defun as-datetime date/-time -Takes a <date>, <time>, or <datetime>, and returns a <datetime> object -with the same data, with the (possibly) missing date or time set to -all zeroes. -@end defun - - -@defun date-zero? date -@defunx time-zero? time -Checks if all components are zero. -@end defun - - -@defun leap-year? year -Given an integer @var{year}, return @code{#t} if it's a leap year, and -@code{#f} otherwise. -@end defun - -@defun days-in-month date -Returns how many days are in the month specified by the <date> @var{date}. -Note that the day component is ignored. -@end defun - -@defun days-in-year date -Returns how many days are in the year pointed to by @var{date}. -@end defun - -@defun start-of-month date -Returns a <date> object equal to date, but with the day component set -to 1. -@end defun - -@defun end-of-month date -Returns a <date> object equal to date, but with the day component set -to the last day of the month. - -@example -(end-of-month #2020-01-10) -⇒ #2020-01-31 -(end-of-month #2020-02-01) -⇒ #2020-02-29 -@end example -@end defun - - -@defun start-of-year date -Returns a <date> object equal to date, but with the day and month -component set to 1. -@end defun - -@defun date-stream date-increment start-day -Returns an @ref{(guile)SRFI-43} stream of <date> objects, starting at -@var{start-day} and stepping in increments of @var{date-increment}. -@end defun - -@defun day-stream start-day -Returns a stream of each day from @var{start-day}. -@end defun - -@defun month-stream start-day -Returns a stream of each months from @var{start-day}. -Day component stays the same. -@end defun - -@defun week-stream start-day -Returns a stream of each week from @var{start-day} -(increments of 7 days). -@end defun - -@defun time-min a b -@defunx time-max a b -@defunx date-min a b -@defunx date-max a b -@defunx datetime-min a b -@defunx datetime-max a b -Returns the smaller (or larger) of @var{a} or @var{b}. -@end defun - -@defun week-day date -Returns an integer representing the week day of @var{date}. -@ref{sunday} -@end defun - - -@defun week-1-start date [week-start=(week-start)] -Returns the date which week 1 starts on, according to the (at least) -Swedish rule of week counting. -@ref{week-start} -@end defun - - -@defun week-number date [week-start=(week-start)] -Returns the week number of @var{date}, according to the (at least) -Swedish rule of week counting. -@ref{week-start} -@end defun - -@defun date-starting-week week-number date [week-start=(week-start)] -Returns the first day of week @var{week-number}, @var{date} is used -for year information. -@ref{week-start} -@end defun - - -@defun week-day-name week-day [truncate-to] [#:key locale] -Returns the locale dependent name for the given week day. - -@var{week-day} is a number per @ref{sunday}. -@var{truncate-to} may be a number, which limits to the first @var{n} -letters of the resulting string. -@end defun - - -@defun timespan-overlaps? s1-begin s1-end s2-begin s2-end -Check if the interval @var{s1-begin} to @var{s1-end} overlaps with the -interval @var{s2-begin} to @var{s2-end}. -@end defun - -@defun find-first-week-day week-day date -Returns the first instance of the given week-day after @var{date}. - -@example -(find-first-week-day mon #2020-04-01) -⇒ #2020-04-06 -(find-first-week-day mon #2020-04-10) -⇒ #2020-04-13 -(find-first-week-day mon #2020-04-30) -⇒ #2020-05-04 -@end example -@end defun - -@defun all-wday-in-month week-day month-date -Returns instances of the given week-day in month between -month-date and end of month. -@example -(all-wday-in-month mon #2020-06-01) -⇒ (#2020-06-01 #2020-06-08 #2020-06-15 #2020-06-22 #2020-06-29) -(all-wday-in-month mon #2020-06-10) -⇒ (#2020-06-15 #2020-06-22 #2020-06-29) -@end example -@end defun - -@defun all-wday-in-year week-day year-date -Returns a list of all instances of @var{week-day} in @var{year-date}. -@end defun - -@defun in-date-range? start-date end-date → date → boolean -Returns a predicate procedure, which checks if a given date is between -@var{start-date} and @var{end-date}. -@end defun - -@defun weekday-list [week-start=(week-start)] -Returns a list of the seven week days, with @var{week-start} -as the beginning of the week. -@end defun - - -@defun start-of-week d [week-start=(week-start)] -@defunx end-of-week d [week-start=(week-start)] -Returns the date the week containing @var{d} started or ended. -@end defun - - -@defun month-days date [week-start=(week-start)] -Given a month and and which day the week starts on, -returns three lists, which are: -The days leading up to the current month, but share a week -The days in the current month -The days after the current month, but which shares a week. - -@example - mars 2020 -må ti on to fr lö sö - 1 - 2 3 4 5 6 7 8 - 9 10 11 12 13 14 15 -16 17 18 19 20 21 22 -23 24 25 26 27 28 29 -30 31 -@end example -@lisp -(month-days #2020-03-01 mon) -; ⇒ (2020-02-24 ... 2020-02-29) -; ⇒ (2020-03-01 ... 2020-03-31) -; ⇒ (2020-04-01 ... 2020-04-05) -@end lisp -Ignores day component of @var{date}. -@end defun - - -@defun days-in-interval start-date end-date -The amount of days in the given interval, including both endpoints. -@end defun - - -@defun year-day date -Day from start of the year, so 1 feb would be day 32. -Also known as Julian day. -@end defun - - -@defun time->decimal-hour time -Convert @var{time} to a decimal value, so 10:30 would become 10.5. -@end defun - -@defun datetime->decimal-hour dt [start-date] -Similar to @code{time->decimal-hour}, but also looks at the date component. - -@var{start-date} is required if either the month of year component of -@var{dt} is non-zero (since months and years have a variable number of hours). -@end defun - -@defun date-range start end [increment=(date day: 1)] -Returns a list of all dates from start to end. -Both inclusive -@end defun - -@defun locale-month -@defunx locale-month-short -These are direct re-exports from (ice-9 i18n) - -@xref{Accessing Locale Information,,,guile}. -@end defun - -@defun date= args ... -@defunx date=? args ... -@defunx date< args ... -@defunx date<? args ... -@defunx date> args ... -@defunx date>? args ... -@defunx date<= args ... -@defunx date<=? args ... -@defunx date>= args ... -@defunx date>=? args ... -Checks if all date arguments satisfy the predicate. -@end defun - -@defun time= args ... -@defunx time=? args ... -@defunx time< a b -@defunx time<? a b -@defunx time> a b -@defunx time>? a b -@defunx time<= a b -@defunx time<=? a b -@defunx time>= a b -@defunx time>=? a b -Checks if all time arguments satisfy the predicate. -@end defun - -@defun datetime= args ... -@defunx datetime=? args ... -@defunx datetime< a b -@defunx datetime<? a b -@defunx datetime> a b -@defunx datetime>? a b -@defunx datetime<= a b -@defunx datetime<=? a b -@defunx datetime>= a b -@defunx datetime>=? a b -Check if all datetime arguments satisfy the predicate. -The timezone field is ignored. -@end defun - -@defun date/-time< a b -@defunx date/-time<? a b -@defunx date/-time> a b -@defunx date/-time>? a b -@defunx date/-time<= a b -@defunx date/-time<=? a b -@defunx date/-time>= a b -@defunx date/-time>=? a b -Equivalent to the @code{datetime*} versions, but wraps its arguments -in @code{as-datetime}. -@end defun - -@subsection Arithmetic - -While only one date (and one time) type is available, it really should -be seen as two. Absolute dates, such as the fourth of november, -2022. The other type are intervals, such as 3 years, 4 months and 2 days. - -A ``type mismatch'' might therefore lead to some confounding results. -@example -(date- #2020-01-01 #2020-01-01) -⇒ #00-1-11-31 -(date-difference #2020-01-01 #2020-01-01) -⇒ #0000-00-00 -@end example - -@defun date+ base rest ... -@defunx date- base rest ... -Add or remove each difference from base. -@end defun - -@defun date-difference end start -Returns difference between the two dates, in years, months, and days. -In such a way that - -@lisp -(date= (date+ start (date-difference end start))) -@end lisp -@end defun - -@defun time+ base rest ... -@defunx time- base rest ... -Adds (or subtracts) each difference from the base, and returns two -values. The sum, and how many midnight's have passed. - -@lisp -(time+ #22:00:00 (time hour: 4)) -⇒ #02:00:00 -⇒ 1 -@end lisp -@end defun - -@defun datetime+ base change -@defunx datetime- base change -@end defun - -@defun datetime-difference end start -@end defun - -@subsection Parsing and Formatting - -@defun datetime->string datetime [fmt=''~Y-~m-~dT~H:~M:~S''] [#:allow-unknown?] - -Formats @var{datetime} into a string. -The function will throw an error when encountering an unknown format -specifier, unless @var{#:allow-unknown} is true. - -@table @samp -@item ~~ -A literal tilde (~). -@item ~H -Hour, left padded with zeroes to length 2. -@item ~k -Like @samp{~H}, but padded with spaces. -@item ~M -Minute, left padded with zeroes to length 2. -@item ~S -Seconds, left padded with zeroes to length 2. -@item ~Y -Year, left padded with zeroes to length 4; -@item ~m -Month number, left padded with zeroes to length 2. -@item ~d -Day in month, left padded with zeroes to length 2. -@item ~s -Epoch time, per UNIX. -@item ~e -Same as @samp{~d}, but padded with spaces. -@item ~1 -Shorthand for @samp{~Y-~m-~d}. -@item ~3 -Shorthand for @samp{~H:~M:~S}. -@item ~A -Locale week day name. -@item ~a -Locale week day name, truncated to 3 characters. -@item ~b -Locale month name, truncated. -@item ~B -Locale month name, in full. -@item ~Z -@samp{Z} if the timezone is @samp{UTC}. Nothing otherwise. -@end table -@end defun - -@defun date->string date [fmt=''~Y-~m-~d''] [#:allow-unknown?] -@defunx time->string date [fmt=''~H:~M:~S''] [#:allow-unknown?] -Simple wrappers around @code{datetime->string}, which works directly -on date or time objects. -@end defun - - -@defun string->datetime str [fmt=''~Y-~m-~dT~H:~M:~S~Z''] [locale=%global-locale] -Attempts to parse @var{str} as a datetime, according to the ruleset @var{fmt}. -An invalid or unparsable string will throw an error. - -Each token in @var{fmt} informs the parser what the next expected -token in @var{str} is. If a binding rule is parsed multiple times, -then the last one is used for the resulting object. For example, -@example -(string->datetime "10:20" "~H:~H") -⇒ (datetime hour: 20) -@end example - -spaces are literal, there is no way to match an arbitrary number of -whitespace characters - -@table @samp -@item ~~ -Next token is a literal tilde. - -@item ~Z -If next token is a literal @samp{Z} then the resulting timezone is set -to @samp{UTC}, otherwise does nothing. - -@item ~p -The next token is an AM/PM indicator, matched by the regex -@code{^([AaPp])[.]?[Mm][.]?}. A valid token will reinterpret the last -hour indicator as 12-hour time (instead of 24 hour time), regardless -if its before or after this token. - -@item ~b -@itemx ~B -@itemx ~h -Parses a month by name, just as @code{parse-month}. - -@item ~H -@itemx ~M -@itemx ~S -@itemx ~m -@itemx ~d -Parses up to two digits, but possibly less if a non-digit appears in -the string. Then stores the resulting value in either the hour, -minute, second, month, or day slot of the resulting object. - -This double function allows both dates without delimiters, such as -``0102'' to be correctly parsed, but also more free form formats, such -as ``1 jan''. - -@item ~Y -Equivalent to @samp{~H}, but reads up to 4 digits, and stores the -result in the year field. -@end table -@end defun - - -@defun parse-month str [locale=%global-locale] -Returns the first month whose name has @var{str} as its prefix. -The result will be on the interval [1, 12], or -1 if no month matched. -@end defun - - -@defun string->time str [fmt=''~H:~M:~S''] [locale=%global-locale] -@defunx string->date str [fmt=''~Y-~m-~d''] [locale=%global-locale] -Wrappers around @code{string->datetime}, but only returning the time -or date component. -@end defun - - -@defun string->date/-time string -Parses string as an ISO-8601 string. Checks for the existence of -@code{T}, @code{:}, or @code{-} to determine if it's a datetime, time -or date. -@end defun - -@defun parse-ics-date str -@defunx parse-ics-time str -@defunx parse-ics-datetime str [zone] -Parses dates per RFC5545. -@end defun - -@defun parse-iso-date str -@defunx parse-iso-time str -@defunx parse-iso-datetime str -Parses (the well known subset) of ISO-compatible dates. -@end defun - -@defun parse-freeform-date str -Currently an alias for parse-iso-datetime, but should preferably be extended. -@end defun |