]> gitweb.factorcode.org Git - factor.git/blob - basis/calendar/calendar-docs.factor
calendar: remove normalize-timestamp, cleanup convert-timezone.
[factor.git] / basis / calendar / calendar-docs.factor
1 ! Copyright (C) 2008 Doug Coleman.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: arrays kernel math strings help.markup help.syntax
4 math.order ;
5 IN: calendar
6
7 HELP: duration
8 { $description "A duration is a period of time years, months, days, hours, minutes, and seconds. All duration slots can store " { $link real } " numbers. Compare two durations with the " { $link <=> } " word." } ;
9
10 HELP: timestamp
11 { $description "A timestamp is a date and a time with a timezone offset. Timestamp slots must store integers except for " { $snippet "seconds" } ", which stores reals, and " { $snippet "gmt-offset" } ", which stores a " { $link duration } ". Compare two durations with the " { $link <=> } " word." } ;
12
13 { timestamp duration } related-words
14
15 HELP: gmt-offset-duration
16 { $values { "duration" duration } }
17 { $description "Returns a " { $link duration } " object with the GMT offset returned by " { $link gmt-offset } "." } ;
18
19 HELP: <date>
20 { $values { "year" integer } { "month" integer } { "day" integer } { "timestamp" timestamp } }
21 { $description "Returns a timestamp object representing the start of the specified day in your current timezone." }
22 { $examples
23     { $example "USING: accessors calendar prettyprint ;"
24                "2010 12 25 <date> instant >>gmt-offset ."
25                "T{ timestamp { year 2010 } { month 12 } { day 25 } }"
26     }
27 } ;
28
29 HELP: average-month
30 { $values { "value" ratio } }
31 { $description "The length of an average month averaged over 400 years. Used internally for adding an arbitrary real number of months to a timestamp." } ;
32
33 HELP: months-per-year
34 { $values { "value" integer } }
35 { $description "Returns the number of months in a year." } ;
36
37 HELP: days-per-year
38 { $values { "value" ratio } }
39 { $description "Returns the number of days in a year averaged over 400 years. Used internally for adding an arbitrary real number of days to a timestamp." } ;
40
41 HELP: hours-per-year
42 { $values { "value" ratio } }
43 { $description "Returns the number of hours in a year averaged over 400 years. Used internally for adding an arbitrary real number of hours to a timestamp." } ;
44
45 HELP: minutes-per-year
46 { $values { "value" ratio } }
47 { $description "Returns the number of minutes in a year averaged over 400 years. Used internally for adding an arbitrary real number of minutes to a timestamp." } ;
48
49 HELP: seconds-per-year
50 { $values { "value" integer } }
51 { $description "Returns the number of seconds in a year averaged over 400 years. Used internally for adding an arbitrary real number of seconds to a timestamp." } ;
52
53 HELP: julian-day-number
54 { $values { "year" integer } { "month" integer } { "day" integer } { "n" integer } }
55 { $description "Calculates the Julian day number from a year, month, and day. The difference between two Julian day numbers is the number of days that have elapsed between the two corresponding dates." }
56 { $warning "Not valid before year -4800 BCE." } ;
57
58 HELP: julian-day-number>date
59 { $values { "n" integer } { "year" integer } { "month" integer } { "day" integer } }
60 { $description "Converts from a Julian day number back to a year, month, and day." } ;
61 { julian-day-number julian-day-number>date } related-words
62
63 HELP: >date<
64 { $values { "timestamp" timestamp } { "year" integer } { "month" integer } { "day" integer } }
65 { $description "Explodes a " { $snippet "timestamp" } " into its year, month, and day components." }
66 { $examples { $example "USING: arrays calendar prettyprint ;"
67                        "2010 8 24 <date> >date< 3array ."
68                        "{ 2010 8 24 }"
69                        }
70 } ;
71
72 HELP: >time<
73 { $values { "timestamp" timestamp } { "hour" integer } { "minute" integer } { "second" integer } }
74 { $description "Explodes a " { $snippet "timestamp" } " into its hour, minute, and second components." }
75 { $examples { $example "USING: arrays calendar prettyprint ;"
76                        "now noon >time< 3array ."
77                        "{ 12 0 0 }"
78                        }
79 } ;
80
81 { >date< >time< } related-words
82
83 HELP: instant
84 { $values { "duration" duration } }
85 { $description "Pushes a " { $snippet "duration" } " of zero seconds." } ;
86
87 HELP: years
88 { $values { "x" number } { "duration" duration } }
89 { $description "Creates a duration object with the specified number of years." } ;
90
91 HELP: months
92 { $values { "x" number } { "duration" duration } }
93 { $description "Creates a duration object with the specified number of months." } ;
94
95 HELP: days
96 { $values { "x" number } { "duration" duration } }
97 { $description "Creates a duration object with the specified number of days." } ;
98
99 HELP: weeks
100 { $values { "x" number } { "duration" duration } }
101 { $description "Creates a duration object with the specified number of weeks." } ;
102
103 HELP: hours
104 { $values { "x" number } { "duration" duration } }
105 { $description "Creates a duration object with the specified number of hours." } ;
106
107 HELP: minutes
108 { $values { "x" number } { "duration" duration } }
109 { $description "Creates a duration object with the specified number of minutes." } ;
110
111 HELP: seconds
112 { $values { "x" number } { "duration" duration } }
113 { $description "Creates a duration object with the specified number of seconds." } ;
114
115 HELP: milliseconds
116 { $values { "x" number } { "duration" duration } }
117 { $description "Creates a duration object with the specified number of milliseconds." } ;
118
119 HELP: microseconds
120 { $values { "x" number } { "duration" duration } }
121 { $description "Creates a duration object with the specified number of microseconds." } ;
122
123 HELP: nanoseconds
124 { $values { "x" number } { "duration" duration } }
125 { $description "Creates a duration object with the specified number of nanoseconds." } ;
126
127 { years months days hours minutes seconds milliseconds microseconds nanoseconds } related-words
128
129 HELP: leap-year?
130 { $values { "obj" object } { "?" boolean } }
131 { $description "Returns " { $link t } " if the object represents a leap year." }
132 { $examples
133     { $example "USING: calendar prettyprint ;"
134                "2008 leap-year? ."
135                "t"
136     }
137     { $example "USING: calendar prettyprint ;"
138                "2010 1 1 <date> leap-year? ."
139                "f"
140     }
141 } ;
142
143 HELP: time+
144 { $values { "time1" "timestamp or duration" } { "time2" "timestamp or duration" } { "time3" "timestamp or duration" } }
145 { $description "Adds two durations to produce a duration or adds a timestamp and a duration to produce a timestamp. The calculation takes timezones into account." }
146 { $examples
147     { $example "USING: calendar math.order prettyprint ;"
148                "10 months 2 months time+ 1 years <=> ."
149                "+eq+"
150     }
151     { $example "USING: accessors calendar math.order prettyprint ;"
152                "2010 1 1 <date> 3 days time+ day>> ."
153                "4"
154     }
155 } ;
156
157 HELP: duration>years
158 { $values { "duration" duration } { "x" number } }
159 { $description "Calculates the length of a duration in years." }
160 { $examples
161     { $example "USING: calendar prettyprint ;"
162                "6 months duration>years ."
163                "1/2"
164     }
165 } ;
166
167 HELP: duration>months
168 { $values { "duration" duration } { "x" number } }
169 { $description "Calculates the length of a duration in months." }
170 { $examples
171     { $example "USING: calendar prettyprint ;"
172                "30 days duration>months ."
173                "16000/16233"
174     }
175 } ;
176
177 HELP: duration>days
178 { $values { "duration" duration } { "x" number } }
179 { $description "Calculates the length of a duration in days." }
180 { $examples
181     { $example "USING: calendar prettyprint ;"
182                "6 hours duration>days ."
183                "1/4"
184     }
185 } ;
186
187 HELP: duration>hours
188 { $values { "duration" duration } { "x" number } }
189 { $description "Calculates the length of a duration in hours." }
190 { $examples
191     { $example "USING: calendar prettyprint ;"
192                "3/4 days duration>hours ."
193                "18"
194     }
195 } ;
196 HELP: duration>minutes
197 { $values { "duration" duration } { "x" number } }
198 { $description "Calculates the length of a duration in minutes." }
199 { $examples
200     { $example "USING: calendar prettyprint ;"
201                "6 hours duration>minutes ."
202                "360"
203     }
204 } ;
205 HELP: duration>seconds
206 { $values { "duration" duration } { "x" number } }
207 { $description "Calculates the length of a duration in seconds." }
208 { $examples
209     { $example "USING: calendar prettyprint ;"
210                "6 minutes duration>seconds ."
211                "360"
212     }
213 } ;
214
215 HELP: duration>milliseconds
216 { $values { "duration" duration } { "x" number } }
217 { $description "Calculates the length of a duration in milliseconds." }
218 { $examples
219     { $example "USING: calendar prettyprint ;"
220                "6 seconds duration>milliseconds ."
221                "6000"
222     }
223 } ;
224
225 HELP: duration>microseconds
226 { $values { "duration" duration } { "x" number } }
227 { $description "Calculates the length of a duration in microseconds." }
228 { $examples
229     { $example "USING: calendar prettyprint ;"
230                "6 seconds duration>microseconds ."
231                "6000000"
232     }
233 } ;
234
235 HELP: duration>nanoseconds
236 { $values { "duration" duration } { "x" number } }
237 { $description "Calculates the length of a duration in nanoseconds." }
238 { $examples
239     { $example "USING: calendar prettyprint ;"
240                "6 seconds duration>nanoseconds ."
241                "6000000000"
242     }
243 } ;
244
245 { duration>years duration>months duration>days duration>hours duration>minutes duration>seconds duration>milliseconds duration>microseconds duration>nanoseconds } related-words
246
247
248 HELP: time-
249 { $values { "time1" "timestamp or duration" } { "time2" "timestamp or duration" } { "time3" "timestamp or duration" } }
250 { $description "Subtracts two durations to produce a duration or subtracts a duration from a timestamp to produce a timestamp. The calculation takes timezones into account." }
251 { $examples
252     { $example "USING: calendar math.order prettyprint ;"
253                "10 months 2 months time- 8 months <=> ."
254                "+eq+"
255     }
256     { $example "USING: accessors calendar math.order prettyprint ;"
257                "2010 1 1 <date> 3 days time- day>> ."
258                "29"
259     }
260 } ;
261
262 HELP: convert-timezone!
263 { $values { "timestamp" timestamp } { "duration" duration } }
264 { $description "Converts the " { $snippet "timestamp" } "'s " { $snippet "gmt-offset" } " to the GMT offset represented by the " { $snippet "duration" } "." }
265 { $examples
266     { $example "USING: accessors calendar prettyprint ;"
267                "gmt noon instant -5 >>hour convert-timezone! gmt-offset>> hour>> ."
268                "-5"
269     }
270 } ;
271
272 HELP: >local-time
273 { $values { "timestamp" timestamp } { "timestamp'" timestamp } }
274 { $description "Converts the " { $snippet "timestamp" } " to the timezone of your computer." }
275 { $examples
276     { $example "USING: accessors calendar kernel prettyprint ;"
277                "now gmt >local-time [ gmt-offset>> ] same? ."
278                "t"
279     }
280 } ;
281
282 HELP: >gmt
283 { $values { "timestamp" timestamp } { "timestamp'" timestamp } }
284 { $description "Converts the " { $snippet "timestamp" } " to the GMT timezone." }
285 { $examples
286     { $example "USING: accessors calendar kernel prettyprint ;"
287                "now >gmt gmt-offset>> hour>> ."
288                "0"
289     }
290 } ;
291
292 HELP: time*
293 { $values { "obj1" object } { "obj2" object } { "obj3" object } }
294 { $description "Multiplies each time slot of a timestamp or duration by a number and make a new duration from the result. Used in the implementation of " { $link before } "." } ;
295 { time+ time- time* } related-words
296
297 HELP: before
298 { $values { "duration" duration } { "-duration" duration } }
299 { $description "Negates a duration." }
300 { $examples
301     { $example "USING: accessors calendar prettyprint ;"
302                "3 hours before now noon time+ hour>> ."
303                "9"
304     }
305 } ;
306
307 HELP: unix-1970
308 { $values { "timestamp" timestamp } }
309 { $description "Returns the beginning of UNIX time, or midnight, January 1, 1970." } ;
310
311 HELP: micros>timestamp
312 { $values { "x" number } { "timestamp" timestamp } }
313 { $description "Converts a number of microseconds into a timestamp value in GMT time." }
314 { $examples
315     { $example "USING: accessors calendar prettyprint ;"
316                "1000 micros>timestamp year>> ."
317                "1970"
318     }
319 } ;
320
321 HELP: gmt
322 { $values { "timestamp" timestamp } }
323 { $description "Returns the time right now, but in the GMT timezone." } ;
324
325 { gmt now } related-words
326
327 HELP: now
328 { $values { "timestamp" timestamp } }
329 { $description "Returns the time right now in your computer's timezone." }
330 { $examples
331     { $unchecked-example "USING: calendar prettyprint ;"
332         "now ."
333          "T{ timestamp f 2008 9 1 16 38 24+801/1000 T{ duration f 0 0 0 -5 0 0 } }"
334     }
335 } ;
336
337 HELP: hence
338 { $values { "duration" duration } { "timestamp" timestamp } }
339 { $description "Computes a time in the future that is the " { $snippet "duration" } " added to the result of " { $link now } "." }
340 { $examples
341     { $unchecked-example
342        "USING: calendar prettyprint ;"
343        "10 hours hence ."
344        "T{ timestamp f 2008 9 2 2 47 45+943/1000 T{ duration f 0 0 0 -5 0 0 } }"
345     }
346 } ;
347
348 HELP: ago
349 { $values { "duration" duration } { "timestamp" timestamp } }
350 { $description "Computes a time in the past that is the " { $snippet "duration" } " subtracted from the result of " { $link now } "." }
351 { $examples
352     { $unchecked-example
353        "USING: calendar prettyprint ;"
354        "3 weeks ago ."
355        "T{ timestamp f 2008 8 11 16 49 52+99/500 T{ duration f 0 0 0 -5 0 0 } }"
356     }
357 } ;
358
359 HELP: (day-of-week)
360 { $values { "year" integer } { "month" integer } { "day" integer } { "n" integer } }
361 { $description "An implementation of the Zeller's congruence algorithm that computes the day of the week given a date. Days are indexed starting from Sunday, which is index 0." }
362 { $notes "User code should use the " { $link day-of-week } " word, which takes a " { $snippet "timestamp" } " instead of integers." } ;
363
364 HELP: days-in-year
365 { $values { "obj" "a timestamp or an integer" } { "n" integer } }
366 { $description "Calculates the number of days in a given year." }
367 { $examples
368     { $example "USING: calendar prettyprint ;"
369                "2004 days-in-year ."
370                "366"
371     }
372 } ;
373
374 HELP: days-in-month
375 { $values { "timestamp" timestamp } { "n" integer } }
376 { $description "Calculates the number of days in a given month." }
377 { $examples
378     { $example "USING: calendar prettyprint ;"
379                "2008 8 24 <date> days-in-month ."
380                "31"
381     }
382 } ;
383
384 HELP: day-of-week
385 { $values { "timestamp" timestamp } { "n" integer } }
386 { $description "Calculates the index of the day of the week. Sunday will result in an index of 0." }
387 { $examples
388     { $example "USING: calendar prettyprint ;"
389                "now sunday day-of-week ."
390                "0"
391     }
392 } ;
393
394 HELP: day-of-year
395 { $values { "timestamp" timestamp } { "n" integer } }
396 { $description "Calculates the day of the year, resulting in a number from 1 to 366 (leap years)." }
397 { $examples
398     { $example "USING: calendar prettyprint ;"
399                "2008 1 4 <date> day-of-year ."
400                "4"
401     }
402 } ;
403
404 HELP: week-number
405 { $values { "timestamp" timestamp } { "[1,53]" integer } }
406 { $description "Calculates the ISO 8601 week number from 1 to 53 (leap years). See " { $snippet "https://en.wikipedia.org/wiki/ISO_week_date" } }
407 { $examples
408     "Last day of 2018 is already in the first week of 2019."
409     { $example "USING: calendar prettyprint ;"
410                "2018 12 31 <date> week-number ."
411                "1"
412     }
413     "2020 is a leap year with 53 weeks, and January 1st, 2021 is still in week 53 of 2020."
414     { $example "USING: calendar prettyprint ;"
415                "2021 1 1 <date> week-number ."
416                "53"
417     }
418 } ;
419
420 HELP: sunday
421 { $values { "timestamp" timestamp } { "new-timestamp" timestamp } }
422 { $description "Returns the Sunday from the current week, which starts on a Sunday." } ;
423
424 HELP: monday
425 { $values { "timestamp" timestamp } { "new-timestamp" timestamp } }
426 { $description "Returns the Monday from the current week, which starts on a Sunday." } ;
427
428 HELP: tuesday
429 { $values { "timestamp" timestamp } { "new-timestamp" timestamp } }
430 { $description "Returns the Tuesday from the current week, which starts on a Sunday." } ;
431
432 HELP: wednesday
433 { $values { "timestamp" timestamp } { "new-timestamp" timestamp } }
434 { $description "Returns the Wednesday from the current week, which starts on a Sunday." } ;
435
436 HELP: thursday
437 { $values { "timestamp" timestamp } { "new-timestamp" timestamp } }
438 { $description "Returns the Thursday from the current week, which starts on a Sunday." } ;
439
440 HELP: friday
441 { $values { "timestamp" timestamp } { "new-timestamp" timestamp } }
442 { $description "Returns the Friday from the current week, which starts on a Sunday." } ;
443
444 HELP: saturday
445 { $values { "timestamp" timestamp } { "new-timestamp" timestamp } }
446 { $description "Returns the Saturday from the current week, which starts on a Sunday." } ;
447
448 { sunday monday tuesday wednesday thursday friday saturday } related-words
449
450 HELP: midnight
451 { $values { "timestamp" timestamp } { "new-timestamp" timestamp } }
452 { $description "Returns a new timestamp that represents the day at midnight, or the beginning of the day." } ;
453
454 HELP: noon
455 { $values { "timestamp" timestamp } { "new-timestamp" timestamp } }
456 { $description "Returns a new timestamp that represents the day at noon, or the middle of the day." } ;
457
458 HELP: today
459 { $values { "timestamp" timestamp } }
460 { $description "Returns a timestamp that represents today at midnight." } ;
461
462 HELP: start-of-month
463 { $values { "timestamp" timestamp } { "new-timestamp" timestamp } }
464 { $description "Returns a new timestamp with the day set to one." } ;
465
466 HELP: start-of-week
467 { $values { "timestamp" timestamp } { "new-timestamp" timestamp } }
468 { $description "Returns a new timestamp where the day of the week is Sunday." } ;
469
470 HELP: start-of-year
471 { $values { "object" object } { "new-timestamp" timestamp } }
472 { $description "Returns a new timestamp with the month and day set to one, or January 1 of the input timestamp, given a year or a timestamp." } ;
473
474 HELP: time-since-midnight
475 { $values { "timestamp" timestamp } { "duration" duration } }
476 { $description "Calculates a " { $snippet "duration" } " that represents the elapsed time since midnight of the input " { $snippet "timestamp" } "." } ;
477
478 HELP: since-1970
479 { $values
480      { "duration" duration }
481      { "timestamp" timestamp } }
482 { $description "Adds the duration to the beginning of Unix time and returns the result as a timestamp." } ;
483
484 ARTICLE: "calendar" "Calendar"
485 "The " { $vocab-link "calendar" } " vocabulary defines two data types and a set of operations on them:"
486 { $subsections
487     timestamp
488     duration
489 }
490 "Durations represent spans of time:"
491 { $subsections "using-durations" }
492 "Arithmetic on timestamps and durations:"
493 { $subsections "timestamp-arithmetic" }
494 "Getting the current timestamp:"
495 { $subsections
496     now
497     gmt
498 }
499 "Time zones:"
500 { $subsections
501     >local-time
502     >gmt
503     convert-timezone!
504 }
505 "Timestamps relative to each other:"
506 { $subsections "relative-timestamps" }
507 "Operations on units of time:"
508 { $subsections
509     "years"
510     "months"
511     "days"
512 }
513 "Both " { $link timestamp } "s and " { $link duration } "s implement the " { $link "math.order" } "."
514 $nl
515 "Meta-data about the calendar:"
516 { $subsections "calendar-facts" } ;
517
518 ARTICLE: "timestamp-arithmetic" "Timestamp arithmetic"
519 "Adding timestamps and durations, or durations and durations:"
520 { $subsections time+ }
521 "Subtracting:"
522 { $subsections time- }
523 "Element-wise multiplication:"
524 { $subsections time* } ;
525
526 ARTICLE: "using-durations" "Using durations"
527 "Creating a duration object:"
528 { $subsections
529     years
530     months
531     weeks
532     days
533     hours
534     minutes
535     seconds
536     milliseconds
537     microseconds
538     nanoseconds
539     instant
540 }
541 "Converting a duration to a number:"
542 { $subsections
543     duration>years
544     duration>months
545     duration>days
546     duration>hours
547     duration>minutes
548     duration>seconds
549     duration>milliseconds
550     duration>microseconds
551     duration>nanoseconds
552 } ;
553
554 ARTICLE: "relative-timestamps" "Relative timestamps"
555 "In the future:"
556 { $subsections hence }
557 "In the past:"
558 { $subsections ago }
559 "Invert a duration:"
560 { $subsections before }
561 "Days of the week relative to " { $link now } ":"
562 { $subsections
563     sunday
564     monday
565     tuesday
566     wednesday
567     thursday
568     friday
569     saturday
570 }
571 "New timestamps relative to calendar events:"
572 { $subsections
573     start-of-year
574     start-of-month
575     start-of-week
576     midnight
577     noon
578 } ;
579
580 ARTICLE: "calendar-facts" "Calendar facts"
581 "Calendar facts:"
582 { $subsections
583     average-month
584     months-per-year
585     days-per-year
586     hours-per-year
587     minutes-per-year
588     seconds-per-year
589     days-in-month
590     day-of-year
591     day-of-week
592     week-number
593 }
594 "Calculating a Julian day number:"
595 { $subsections julian-day-number }
596 "Calculate a timestamp:"
597 { $subsections julian-day-number>date } ;
598
599 ARTICLE: "years" "Year operations"
600 "Leap year predicate:"
601 { $subsections leap-year? }
602 "Find the number of days in a year:"
603 { $subsections days-in-year } ;
604
605 ABOUT: "calendar"