Files
mercury/tests/hard_coded/calendar_test.exp
Julien Fischer e6d5ca85ea Additions for the calendar module.
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.
2014-12-04 14:47:16 +11:00

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