mirror of
https://github.com/Mercury-Language/mercury.git
synced 2026-04-19 11:23:46 +00:00
library/calendar.m:
Add predicates and functions for converting between 1-based
and 0-based month numbers and values of the month/0 type.
The former are useful when dealing with human-provided dates
whereas the latter are useful when interacting with dates
provided from some foreign language (C and Java for example).
Add a predicate for testing for equality of dates ignoring
their time component.
Replace the locally defined predicate char_to_digit/2 with
calls to char.decimal_digit_to_int/2
Fix some formatting issues.
tests/hard_coded/calendar_test.{m,exp}:
Extend this test case to cover the functionality added
above.
NEWS:
Announce the additions.
174 lines
5.5 KiB
Plaintext
174 lines
5.5 KiB
Plaintext
Partial order on durations:
|
|
P1M <> P30D
|
|
P1M =< P32D
|
|
P3M =< P92D
|
|
P1Y >= PT31535000S
|
|
P11M =< P1Y
|
|
P12M == P1Y
|
|
P1D == PT24H
|
|
PT1S =< PT1M1S
|
|
PT1S =< PT1.0001S
|
|
-PT1S >= -PT1.0001S
|
|
|
|
Adding durations to date-times:
|
|
1901-12-31 00:00:00 + P1D = 1902-01-01 00:00:00
|
|
1901-12-31 00:00:00 + P1M = 1902-01-31 00:00:00
|
|
1901-12-31 00:00:00 + P1Y = 1902-12-31 00:00:00
|
|
1901-12-31 00:00:00 + PT1H = 1901-12-31 01:00:00
|
|
1901-12-31 00:00:00 + PT1M = 1901-12-31 00:01:00
|
|
1901-12-31 00:00:00 + PT1S = 1901-12-31 00:00:01
|
|
2000-02-28 00:00:00 + P1D = 2000-02-29 00:00:00
|
|
2001-01-30 00:00:00 + P1M = 2001-02-28 00:00:00
|
|
2000-01-30 00:00:00 + P1M = 2000-02-29 00:00:00
|
|
2007-01-01 00:00:00 + PT31536000S = 2008-01-01 00:00:00
|
|
2008-01-01 00:00:00 + PT31536000S = 2008-12-31 00:00:00
|
|
2008-03-31 00:00:00 + -P1M = 2008-02-29 00:00:00
|
|
2007-03-31 00:00:00 + -P1M = 2007-02-28 00:00:00
|
|
1000-01-01 00:00:00 + -PT1M = 0999-12-31 23:59:00
|
|
2000-03-01 00:00:00 + -PT1H = 2000-02-29 23:00:00
|
|
-0001-01-01 00:00:00 + -PT1S = -0002-12-31 23:59:59
|
|
-0001-01-01 00:00:00.123 + -PT1.123S = -0002-12-31 23:59:59
|
|
2009-02-28 23:59:59.99 + PT0.01S = 2009-03-01 00:00:00
|
|
2009-02-28 23:59:59.99 + P1MT0.02S = 2009-03-29 00:00:00.01
|
|
|
|
Computing durations:
|
|
G: 2008-01-01 00:00:00 -> 2200-04-04 04:04:04 = P192Y3M3DT4H4M4S checked ok
|
|
G: 2200-04-04 04:04:04 -> 2008-01-01 00:00:00 = -P192Y3M3DT4H4M4S checked ok
|
|
D: 2008-01-01 00:00:00 -> 2200-04-04 04:04:04 = P70220DT4H4M4S checked ok
|
|
D: 2200-04-04 04:04:04 -> 2008-01-01 00:00:00 = -P70220DT4H4M4S checked ok
|
|
|
|
G: 2008-01-31 00:00:00 -> 2008-02-29 10:00:00 = P1MT10H checked ok
|
|
G: 2008-02-29 10:00:00 -> 2008-01-31 00:00:00 = -P29DT10H checked ok
|
|
D: 2008-01-31 00:00:00 -> 2008-02-29 10:00:00 = P29DT10H checked ok
|
|
D: 2008-02-29 10:00:00 -> 2008-01-31 00:00:00 = -P29DT10H checked ok
|
|
|
|
G: 2000-01-31 00:00:00 -> 2001-01-29 00:00:00 = P11M29D checked ok
|
|
G: 2001-01-29 00:00:00 -> 2000-01-31 00:00:00 = -P11M29D checked ok
|
|
D: 2000-01-31 00:00:00 -> 2001-01-29 00:00:00 = P364D checked ok
|
|
D: 2001-01-29 00:00:00 -> 2000-01-31 00:00:00 = -P364D checked ok
|
|
|
|
G: 2000-02-29 00:00:00 -> 2001-01-31 00:00:00 = P11M2D checked ok
|
|
G: 2001-01-31 00:00:00 -> 2000-02-29 00:00:00 = -P11M checked ok
|
|
D: 2000-02-29 00:00:00 -> 2001-01-31 00:00:00 = P337D checked ok
|
|
D: 2001-01-31 00:00:00 -> 2000-02-29 00:00:00 = -P337D checked ok
|
|
|
|
G: 2000-02-29 22:58:58 -> 2001-01-31 23:59:59 = P11M2DT1H1M1S checked ok
|
|
G: 2001-01-31 23:59:59 -> 2000-02-29 22:58:58 = -P11MT1H1M1S checked ok
|
|
D: 2000-02-29 22:58:58 -> 2001-01-31 23:59:59 = P337DT1H1M1S checked ok
|
|
D: 2001-01-31 23:59:59 -> 2000-02-29 22:58:58 = -P337DT1H1M1S checked ok
|
|
|
|
G: 2001-02-28 00:00:00 -> 2001-03-29 00:00:00 = P1M1D checked ok
|
|
G: 2001-03-29 00:00:00 -> 2001-02-28 00:00:00 = -P1M checked ok
|
|
D: 2001-02-28 00:00:00 -> 2001-03-29 00:00:00 = P29D checked ok
|
|
D: 2001-03-29 00:00:00 -> 2001-02-28 00:00:00 = -P29D checked ok
|
|
|
|
G: 2001-02-27 00:00:00 -> 2001-03-29 00:00:00 = P1M2D checked ok
|
|
G: 2001-03-29 00:00:00 -> 2001-02-27 00:00:00 = -P1M1D checked ok
|
|
D: 2001-02-27 00:00:00 -> 2001-03-29 00:00:00 = P30D checked ok
|
|
D: 2001-03-29 00:00:00 -> 2001-02-27 00:00:00 = -P30D checked ok
|
|
|
|
G: 1975-06-05 12:00:00 -> 1977-10-09 12:00:00 = P2Y4M4D checked ok
|
|
G: 1977-10-09 12:00:00 -> 1975-06-05 12:00:00 = -P2Y4M4D checked ok
|
|
D: 1975-06-05 12:00:00 -> 1977-10-09 12:00:00 = P857D checked ok
|
|
D: 1977-10-09 12:00:00 -> 1975-06-05 12:00:00 = -P857D checked ok
|
|
|
|
G: 1977-10-09 12:00:00 -> 1980-01-05 11:11:11 = P2Y2M26DT23H11M11S checked ok
|
|
G: 1980-01-05 11:11:11 -> 1977-10-09 12:00:00 = -P2Y2M26DT23H11M11S checked ok
|
|
D: 1977-10-09 12:00:00 -> 1980-01-05 11:11:11 = P817DT23H11M11S checked ok
|
|
D: 1980-01-05 11:11:11 -> 1977-10-09 12:00:00 = -P817DT23H11M11S checked ok
|
|
|
|
G: 1977-10-09 12:00:00 -> 1980-03-01 12:00:00 = P2Y4M21D checked ok
|
|
G: 1980-03-01 12:00:00 -> 1977-10-09 12:00:00 = -P2Y4M23D checked ok
|
|
D: 1977-10-09 12:00:00 -> 1980-03-01 12:00:00 = P874D checked ok
|
|
D: 1980-03-01 12:00:00 -> 1977-10-09 12:00:00 = -P874D checked ok
|
|
|
|
G: 1977-10-09 12:00:00 -> 1980-03-01 13:01:01.000007 = P2Y4M21DT1H1M1.000007S checked ok
|
|
G: 1980-03-01 13:01:01.000007 -> 1977-10-09 12:00:00 = -P2Y4M23DT1H1M1.000007S checked ok
|
|
D: 1977-10-09 12:00:00 -> 1980-03-01 13:01:01.000007 = P874DT1H1M1.000007S checked ok
|
|
D: 1980-03-01 13:01:01.000007 -> 1977-10-09 12:00:00 = -P874DT1H1M1.000007S checked ok
|
|
|
|
|
|
Day of the week:
|
|
2008-01-15 23:59:00 : tuesday
|
|
2008-01-16 19:08:00 : wednesday
|
|
1360-04-14 00:00:00 : monday
|
|
1865-02-27 00:00:00 : monday
|
|
1886-02-08 00:00:00 : monday
|
|
1929-10-28 00:00:00 : monday
|
|
0000-12-31 00:00:00 : sunday
|
|
0001-01-01 00:00:00 : monday
|
|
-0001-12-31 00:00:00 : friday
|
|
0000-01-01 00:00:00 : saturday
|
|
|
|
Parse test:
|
|
P2Y6M100DT10H16M30.0003S
|
|
|
|
Month-to-int (1-based):
|
|
january -> 1
|
|
february -> 2
|
|
march -> 3
|
|
april -> 4
|
|
may -> 5
|
|
june -> 6
|
|
july -> 7
|
|
august -> 8
|
|
september -> 9
|
|
october -> 10
|
|
november -> 11
|
|
december -> 12
|
|
|
|
Month-to-int (0-based):
|
|
january -> 0
|
|
february -> 1
|
|
march -> 2
|
|
april -> 3
|
|
may -> 4
|
|
june -> 5
|
|
july -> 6
|
|
august -> 7
|
|
september -> 8
|
|
october -> 9
|
|
november -> 10
|
|
december -> 11
|
|
|
|
Int-to-month (1-based):
|
|
-1 -> out-of-range
|
|
0 -> out-of-range
|
|
1 -> january
|
|
2 -> february
|
|
3 -> march
|
|
4 -> april
|
|
5 -> may
|
|
6 -> june
|
|
7 -> july
|
|
8 -> august
|
|
9 -> september
|
|
10 -> october
|
|
11 -> november
|
|
12 -> december
|
|
13 -> out-of-range
|
|
|
|
Int-to-month (0-based):
|
|
-1 -> out-of-range
|
|
0 -> january
|
|
1 -> february
|
|
2 -> march
|
|
3 -> april
|
|
4 -> may
|
|
5 -> june
|
|
6 -> july
|
|
7 -> august
|
|
8 -> september
|
|
9 -> october
|
|
10 -> november
|
|
11 -> december
|
|
12 -> out-of-range
|
|
13 -> out-of-range
|
|
|
|
Same date:
|
|
2014-12-04 12:53:00 == 2014-12-04 12:53:00
|
|
2014-12-04 12:53:00 == 2014-12-04 12:54:00
|
|
2014-12-04 12:53:00 != 2014-12-05 12:53:00
|
|
2014-12-04 12:54:00 != 2014-12-05 12:53:00
|
|
|