The International Standard Calendar is based upon the rules laid out in the international standard ISO 8601. It consists of the primary International Standard Month Calendar, which defines a year based on months and a leap day rule (Gregorian calendar), the alternative International Standard Day Calendar, which just places the leap day at the end of the year, and the secondary International Standard Week Calendar, which uses the same year count but subdivides a year into weeks. The International Calendar is a superset thereof that contains more notation variants and auxiliary calendars. For a similar project, see Extended Date and Time Format (EDTF) at the US Library of Congress, which is a part of ISO 8601-2:2019 in slightly modified form.
Both are more notation frameworks than actual calendars, but only certain calendar designs are compatible with the framework and in some instances, out of several possible alternatives, a single one had to be chosen to be supported.
Disclaimer: The use of the term “ISO” in the body of this article is not meant to claim or imply any formal approval or recommendation of proposals presented herein by the International Organization for Standardization (ISO). It is meant simply to signify that the proposals are compatible with ISO 8601.
Basics[]
A modest way to propose calendar reforms is a set of incremental, backwards-compatible additions and clarifications to this standard. Several such enhancements are possible, some of which are furthermore compatible with alternate calendar proposals, i.e. the International Calendar is a superset thereof.
It is a best practice accepted in standardization to collect existing use deviating from the current standard, analyze it and, finally, form rules based upon the findings, which are compatible as much as possible with both the existing standards and popular habits.
There is, for instance, much precedent in labeling quarters of a year “Q1” through “Q4”, although the exact definition of a quarter varies. It is also common to speak of the nth week of a month, but the standard currently only implicitly defines a rule for that by prescribing which year a week belongs to. It is also common to speak of the nth (instance of a) weekday in a month.
Especially for some religious and esoteric purposes, the solstices and equinoxes (including visibility of constellations) or the phases of the moon are more relevant than months and weeks. It may make sense to define notation for auxiliary years based on that, aligned with the common year count. The seven-day week cycle is important to several religious groups and therefore is hard to break apart from, as has been seen by the failed attempt to introduce the World Calendar by the United Nations in the 1950s.
In financial contexts, the month and year are often simplified to 30 and 360 days, respectively. Elsewhere, a month is often thought of as consisting of 4 full weeks only, which would require slightly more than 13 months per year.
The International Calendar is not related to the International Fixed Calendar.
Guidelines[]
Types of formats
- There must not be ambiguous formats. If two schemes would result in two or more confusable formats, all of them or all but one must be declared invalid.
- Only add a redundant format if there are good reasons for it.
- Extend existing schemes and conventions.
- Apply week of year determination rule to months, quarters etc.
- Reuse the ‘W’ convention for other entities if necessary.
- Single alphabetic letters in a format are called “markers”.
- Every date format must be able to resolve any day. The day must be the smallest possible unit in a date.
Standard vs. basic
- The extended format becomes the standard format, the basic format is a condensed or collapsed or compact version thereof.
- Collapse everything or nothing.
- Support condensed format where possible.
- Do not condense formats with a one-digt part, except when it is the last one and follows an alphabetic marker. (This is a suggestion that this page does not yet adhere to.)
- Do not condense formats with plus or minus sign before the year number.
- Do not support two-digit years without century and era (YY) in new formats, but consider their existence.
- Do not support years with more than ten digits which is already more than than the age of the universe.
- Implementations may support 4 levels of condensation: standard (with all separators present), collapsed (markers consume preceding separator), condensed (all separators only removed if possible) and compressed (all separators suppressed, despite ambiguity ensuing). The standard only describes standard and condensed forms, though.
Implied formats
- Partial values on the right may be left out. This specifies less specific dates.
- Partial values on the left may be left out without dropping separators and markers. Missing parts are implied (usually using the live value).
- Separators may be dropped if markers alone make the format unambiguous.
- In durations sepcified dby start and end date, omitted fields in the end date take the value from the start date. Both should use the same format, unless agreed on otherwise.
Other rules, requirements, constrictions
- Do not break the week cycle.
- Use 97/400 leap year cycle with 4–100–400 rule by default.
- Dates are ordinal, except for the year, but times are rational, i.e. the former start at “first” (1), the latter begin with “none” (0).
Agenda[]
- This subsection lists topics that are known to be left to do.
- Support more obscure units of time keeping, such as school lessons (often 45min), or other parts of timetables and regular schedules.
- Templates: T<#/6> (watch = 4h), THH:<#/2> or THH:<#/4> (bell = 30min or 15min), THH:<##/40> (moment = 90s)
- The fortnight of two weeks is probably not worth supporting.
- Video frames or fields are usually only applied to relative times hh:mm:ss:ff, not absolute ones including the date. Since the picture rate may differ – often 24, 25 or 30 Hz, but can be much higher (HD or slow motion) and lower (time-lapse) – it’s better used with templates hh:mm:ss:<ff/rr>.
- Find and correct mistakes.
- Expand sections marked “under construction”.
- Consider better support of popular lunar calendars such as the Arabic one, but probably only algorithmic ones.
- Support other astrological calendars and zodiac signs.
Existing formats[]
level of detail | full date | sample | |
---|---|---|---|
c | CC | 2 | 2024 |
y | −CCYY | −4 | N/A |
+CCYY | +4 | +2024 | |
CCYY | 4 | 2024 | |
d/y | ±CCYY-DDD | ±4-3 | 2024-80 |
CCYYDDD | 7 | 202480 | |
m/y | ±CCYY-MM | ±4-2 | 2024-03 |
invalid | |||
d/m/y | ±CCYY-MM-DD | ±4-2-2 | 2024-03-21 |
CCYYMMDD | 8 | 20240321 | |
w/y | ±CCYY-WWW | ±4-W2 | 2024-W12 |
±CCYYWWW | ±4W2 | 2024W12 | |
d/w/y | ±CCYY-WWW-D | ±4-W2-1 | 2024-W12-4 |
±CCYYWWWD | ±4W3 | 2024W124 |
The identifier ±CCYY (±4), on this page, refers to any of the three 4-digit formats for small years above and to any large year as specified in the next section.
General clarifications, additions or enhancements[]
Large years[]
- Numeric date format
- ‘+’ or ‘-’ marker
Note: EDTF has a prefix marker ‘y’ and exponential ‘e’ notation
level of detail | full date | sample | ||
---|---|---|---|---|
y | −ECCYY | +ECCYY | ±5 | +02024 |
−EECCYY | +EECCYY | ±6 | +002024 | |
−EEECCYY | +EEECCYY | ±7 | +0002024 | |
−EEEECCYY | +EEEECCYY | ±8 | +00002024 | |
−EEEEECCYY | +EEEEECCYY | ±9 | +000002024 | |
−EEEEEECCYY | +EEEEEECCYY | ±10 | +0000002024 |
±CCYYMM (with leading plus or minus sign) could be confused with six-digit years ±EECCYY, seven-digit and eight-digit years would be ambiguous with the condensed ±CCYYDDD ordinal dates and ±CCYYMMDD full dates, respectively.
Therefore compact formats are only valid without a leading plus or minus sign unless they contain a marker as first character after the year. Note, that the deprecated YYDDD is already compatible with five-digit years ±ECCYY (i.e. almost all of human history).
Todo: Restricted era format with 400-year cycles, e.g. ±EE|YYY
Four-digit years should not have a preceding plus sign to avoid ambiguity. Two digits designate a century, but it is not possible to pad it on the left with zeros, although ISO 8601:2004 allowed this expanded format for prior mutual agreement.
Characters[]
The characters minus sign U+2212 ‘−’ and en dash U+2012 ‘–’ are also valid instead of hyphen-minus U+002D ‘-’ before years. They are invalid as a separator, but the characters hyphen U+2010 ‘‐’ and non-breaking hyphen U+2011 ‘‑’ are valid separators besides U+002D. The character soft hyphen U+00AD ‘’ is a valid separator, but should not be used due to its default invisibility.
The em dash U+2014 ‘—’ is neither a valid minus sign nor a separator, it has special purposes. All other hyphen, dash and minus characters from Unicode must be normalized to one of the aforementioned in a proprietary manner, which may include them being discarded altogether.
Other decimal digits, e.g. arabic, indic or circled ones, are not directly supported. They should be converted to standard digits ‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’ and ‘9’ prior to data interchange.
All space characters, varying only in width and breaking behavior, (U+00A0, 2002–200B, 202F, 205F, 3000) must be normalized to space U+0020 ‘ ’.
minus ::= [\u2212 | \u2012 | \u002D] => \u2212
date-separator ::= [\u2010 | \u2011 | \u00AD | \u002D] => \u2010
digit ::= [0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9]
space ::= [\u0020 | \u2002 | \u2003 | \u2004 | \u2005 | \u2006 | \u2007 | \u2008 | \u2009 | \u200A | \u200B | \u202F | \u205F | \u3000 | \u00A0] => \u0020
All roman letters used are case-independent and should be normalized to uppercase.
Truncation[]
level of detail | century implied | year implied | more implied | sample without century | sample without year | sample with just day | |||
---|---|---|---|---|---|---|---|---|---|
d/y | YY-DDD | 2-3 | -DDD | -3 | 24-081 | -081 | |||
YYDDD | 5 | DDD | 3 | 24 | 081 | ||||
m/y | YY-MM | 2-2 | -MM | -2 | 24-03 | -03 | |||
invalid | invalid | ||||||||
d/m/y | YY-MM-DD | 2-2-2 | -MM-DD | -2-2 | --DD | --2 | 24-03-21 | -03-21 | --21 |
YYMMDD | 6 | invalid | invalid | 240321 | |||||
w/y | YY-WWW | 2-W2 | -WWW | -W2 | 24-W12 | -W12 | |||
YYWWW | 2W2 | WWW | W2 | 24W12 | W12 | ||||
d/w/y | YY-WWW-D | 2-W2-1 | -WWW-D | -W2-1 | --D | --1 | 24-W12-4 | -W12-4 | --4 |
YYWWWD | 2W3 | WWWD | W3 | D | 1 | 24W4 | W124 | 4 |
Implied century was possible in ISO 8601:2000, but all truncated formats were removed in the third edition, ISO 8601:2004. For backwards compatibility, however, CCYYMM instead of YYMMDD is invalid. The current edition only accepts formats with reduced accuracy that truncate from the right.
Also, the left-hand truncation used to work slightly different than the first table shows.
Format | Sample | Hyphens | Implied field(s) | Alternative | Wildcards | |
---|---|---|---|---|---|---|
-YY | -2 | -24 | 1 | century | none | XXYY, +XXXYY, –XXXYY, … |
--MM | --2 | --03 | 2 | year | -MM | XXXXMM, *MM, *-MM, … |
---DD | ---2 | ---21 | 3 | month | --DD | **DD, *-*-DD, -XX-DD, XXXX-XX-DD, … |
-DDD | -3 | -081 | 1* | year | same, DDD | *-DDD, *DDD, XXXXDDD, … |
-WWW | -W2 | -W12 | 1 | year | same, WWW | *-WWW, *WWW, XXXX-WWW, … |
-W-D | -W-1 | -W-4 | 2×1 | week | same | -WXX-D, *W*D, … |
---D | ---1 | ---4 | 3 | any week | --D, D | **D, *-*-D, … |
-Y-WWW | -1-W2 | -4-W12 | 2×1 | decade | none | XXXY-WWW, … |
-YWWW | -1W2 | -4W12 | 1 | decade | none | XXXYWWW, … |
-mm | -2 | T-34 | 1 | hour | :mm | T*mm, *:mm, T*:mm, XX:mm, TXX:mm |
--ss | --2 | T--58 | 2 | minute | ::ss | T**ss, *:*:ss, :*:ss, … |
System | Pattern | Monday | Tuesday | Wednesday | Thursday | Friday | Saturday | Sunday |
---|---|---|---|---|---|---|---|---|
Proposed compact | D | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
Proposed standard | --D | --1 | --2 | --3 | --4 | --5 | --6 | --7 |
Deprecated extended | ---D | ---1 | ---2 | ---3 | ---4 | ---5 | ---6 | ---7 |
Wildcards compact | **D | **1 | **2 | **3 | **4 | **5 | **6 | **7 |
Wildcards standard | *-*-D | *-*-1 | *-*-2 | *-*-3 | *-*-4 | *-*-5 | *-*-6 | *-*-7 |
Alchemical symbol | ☾ / ☽︎ | ♂ | ☿ | ♃ | ♀ | ♄ | ☉︎ / 🜚︎ |
Epoch[]
ISO 8601 uses the date the Metre Convention was signed as its reference date, assigning to it the date 1875-05-20 (1875-W21-2) and it also equates 2001-01-01 with 2001-W01-1. Although honorable, an event that can be reconstructed more exactly and independently, e.g. an astronomic one, might be more appropriate, but must result in an equivalent year count and week cycle.
Leap rule[]
The Gregorian leap rule does not spread leap years evenly across the cycle, but this is not a defect of the cycle length itself. Its 400-year cycle results in terminating fractions and it has the benefit, though, that its rule can easily be memorized and calculated, but only for leap days, not for leap weeks. Gregorian leap day rule: Add a day to the second month when the year number is divisible by 4, but when it is divisible by 100 it must also be divisible by 400. The placement of leap weeks follows from that, although it could be defined independently as in Rick McCarty’s Weekdate.
The default leap rule cannot be changed, because the International Standard Calendar is proleptic and formats are backwards-compatible! Therefore, alternate leap rules must be indicated explicitly.
- The leap cycle is also called an era.
- A leap cycle absolutely must contain an even number of weeks, i.e. the number of days must be divisible by 7.
- Both leap rules should be easy to cite and one should be able to determine whether a given year has a leap day or leap week with mental arithmetic.
- Leap years should be spread as evenly as possible across the leap cycle.
- The leap cycle should not be too long, say a millennium at worst.
- A larger leap cycle should approximate the solar year (about 365 days, 5 hours and 49 minutes) better than any shorter cycle. The approximation should be smaller.
- Otherwise it must have another positive feature to be considered.
- The leap cycle (or a small integer multiple thereof) should contain an even number of lunations.
Note: Details on separate page
There are very few leap ratios that fulfill the basic requirements, the shortest one has 71 leap days and 52 leap weeks in 293 years.
title | years | days | weeks | leap days | leap weeks | mean days/year | mean weeks/year | lunations | olympiads |
---|---|---|---|---|---|---|---|---|---|
Julian | 28 | 10227 | 1461 | 7 | 5 | 365.25 | 52.17(857142) | 346.325… | 7 |
Dee | 231 | 84371 | 12053 | 56 | 41 | 365.(24) | 52.177489… | 2857.071… | <58 |
Qumran | 293 | 107016 | 15288 | 71 | 52 | 365.242321… | 52.177474… | 3623.903… | >73 |
Gregorian | 400 | 146097 | 20871 | 97 | 71 | 365.2425 | 52.1775 | 4947.311… | 100 |
Mädler | 896 | 327257 | 46751 | 217 | 159 | 365.2421875 | 52.177455… | 11081.966… | 224 |
Cycles with an integer number of 4-week months | |||||||||
Dee | 924 | 337484 | 48212 | 224 | 164 | 365.(24) | 52.177489… | 11428.285… | 231 |
Qumran | 1172 | 428064 | 61152 | 284 | 204 | 365.242321… | 52.177474… | 14495.613… | 293 |
293 and 817-year cycles both provide better approximations than the Gregorian one.
The 293-year cycle curiously has as many leap weeks in a cycle as weeks in a normal year. 31 cycles of 293 years each, i.e. 9083 years, are close enough to 112 341 lunations. A lunation could therefore be defined as 107016 days/cycle * 31 cycles / 112341 months = ca. 29.5305899 days/month. 11 cycles work slightly worse.
Intercalary days[]
- D = 0 is not the Sunday (7) of the preceding week, but is reserved for use for days outside the week cycle, e.g. in the Fixed Festivity Calendar.
- DDD = 000 and DD = 00 are likewise intended for a day outside the month, quarter or year cycle.
- WW = W0 and WWW = W00 are likewise intended for a week outside the month, quarter or year cycle.
- MM = 00, M = 0, MMM = M00 and MM = M0 are likewise intended for a month outside the quarter or year cycle.
No intercalary item is specified for the standard calendars, though.
The Aristean calendar proposes to use D = 8 for the leap day (-06-31) and the intercalary day (-12-31), but DDD ordinal day of the year would differ by one from normal years for the second half of leap years. This proprietary solution is not (yet) supported.
Date marker[]
- work in progress (alpha state), not yet reflected in formal grammar
The new marker ‘D’ may be used in front of any date, like ‘T’ is used before times. It does not carry a meaning of day, but it may be used before dates with implied fields, too, so DD and DDDD are valid and unambiguous, but DDD is neither (see Truncation). That means, D1 = Monday (in the week of the current context), D032 = -02-01 (current year).
Note: Details on separate page
This date marker may be substituted by one of several others that specify a certain leap rule and epoch, hence era. Of subdivisions, only fields containing the leap item, the leap item itself and null items are affected by the date marker. Support for date markers other than ‘D’ and the empty one is optional! Values using unsupported date markers must be rejected entirely.
The following table lists all date markers that have been registered so far. It is currently biased towards European tradition and solar calendars and all of it is still subject to change.
Marker | Mnemonic | Epoch | Leap cycle | Leap items | Leap rule |
---|---|---|---|---|---|
none | 0001-01-01 | 400 | 1/97 d, 1/71 w | 4:100:400 | |
by majority of days | |||||
D | default, date, day | 2001-01-01 | ? | ? | ? |
? | |||||
F | financial, fiscal | custom | 400 | 5–6/2097 d | 4:100:400 |
360-day year aligned with standard count, week unused | |||||
G | Gregorian, global | 1582-10-15 | 400 | 1/97 d, -02-29 | 4:100:400 |
weeks begin Sunday, the first Sunday of January starts W01, days before that belong to W00, weeks do not span year boundaries, i.e. they can be partial, dates before the epoch are equal to J. | |||||
I | international | 2001-01-01 | 293 | 1/71 d, 1/52 w, 1/13 m, 1/4 q | ? |
inherent | |||||
J | Julian | AUC | 4 | 1/1 d | every fourth year a day is added to the last month, i.e. February |
years begin -03-01 at any day of the week, the standard week cycle is used | |||||
K | Kalendis | 2001-01-01 | 293 | 1/52 w | distribution as even as possible, 45:79 sub cycles |
inherent | |||||
N | no leap, null year; new | 2001-01-01 | 293 | 1/1 y | years have 364 days, every 294th year is year zero of the next cycle which then aligns once again with the 293-year cycle |
U | user | custom | custom | custom | custom |
custom |
Month-based additions and clarifications[]
3-month triad | |||||||
---|---|---|---|---|---|---|---|
level of detail | full date | year implied | more implied | (full) sample | |||
q/y | ±CCYY-Q | ±4-1 | -Q | -1 | 2024‑1 | ||
m/q/y | ±CCYY-Q-M | ±4-1-1 | -Q-M | -1-1 | 2024‑1‑3 | ||
d/m/q/y | ±CCYY-Q-M-DD | ±4-1-1-2 | -Q-M-DD | -1-1-2 | --M-DD | --1-2 | 2024‑1‑3‑21 |
d/q/y | ±CCYY-Q-DD | ±4-1-2 | -Q-DD | -1-2 | 2024‑1‑81 | ||
weekday | |||||||
level of detail | full date | year implied | more implied | (full) sample | |||
dw/q/y | ±CCYY-Q-WW-D | ±4-1-2-1 | -Q-WW-D | -1-2-1 | 2024‑1‑12‑4 | ||
dw/m/y | ±CCYY-MM-W-D | ±4-2-1-1 | -MM-W-D | -2-1-1 | --W-D | --1-1 | 2024-03‑3‑4 |
The month year has 365 days in a common year or 366 days in a leap year.
Triad: 3-month quarters[]
- Numeric date format
- Triad
- ±CCYY-Q, -Q
- Month of triad
- ±CCYY-Q-M, -Q-M
- Day of month of triad
- ±CCYY-Q-M-DD, -Q-M-DD, --M-DD
- Day of triad
- ±CCYY-Q-DD, -Q-DD
Three consecutive months make one of four triads. They are 90 (or 91 with leap day), 91, 92 and 92 days long, respectively, and align with the month year of course. These should not be subdivided into weeks, although that is supported.
The condensed format without hyphens is not supported with these dates, because they would collide with existing ones.
Month | ‑01 | ‑02 | ‑03 | ‑04 | ‑05 | ‑06 | ‑07 | ‑08 | ‑09 | ‑10 | ‑11 | ‑12 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec | |
Triad | ‑1‑1 | ‑1‑2 | ‑1‑3 | ‑2‑1 | ‑2‑2 | ‑2‑3 | ‑3‑1 | ‑3‑2 | ‑3‑3 | ‑4‑1 | ‑4‑2 | ‑4‑3 |
‑1 | ‑2 | ‑3 | ‑4 |
Weekday of month or of triad[]
- This subsection is optional.
- Numeric date format
- Weekday of triad
- ±CCYY-Q-WW-D, -Q-WW-D
- Weekday of month
- ±CCYY-MM-W-D, -MM-W-D, --W-D
The nth weekday (dow) of a triad or month may be specified by providing the 2-digit or 1-digit pseudo-week number, respectively. Note that, for instance, -1-01-1 through -1-01-7 and -01-1-1 through -01-1-7 do not denote partial weeks but the first seven days of the first triad or month, respectively, which often belong to two different weeks. The day of the week part D therefore is never optional, i.e. -Q-WW (which would be ambiguous with -Q-DD) and -MM-W are invalid, and, like their bases, the formats cannot be condensed.
There is no provision to select the nth weekday of the year.
Week-based additions[]
level of detail | full date | year implied | more implied | (full) sample | |||
---|---|---|---|---|---|---|---|
yw | ±CCYYW | ±4W | 2024W | ||||
±CCYYQ | ±4Q | 2024Q | |||||
±CCYYM | ±4M | 2024M | |||||
13-week quarts | |||||||
qw/y | ±CCYY-QQ | ±4-Q1 | -Q1 | 2024-Q1 | |||
±CCYYQQ | ±4Q1 | Q1 | 2024Q1 | ||||
d/qw/y | ±CCYY-QQ-DD | ±4-Q1-2 | -QQ-DD | -Q1-2 | -Q-DD | -Q-2 | 2024-Q1-81 |
±CCYYQQDD | ±4Q3 | QQDD | Q3 | invalid | 2024Q181 | ||
w/qw/y | ±CCYY-QQ-WWW | ±4-Q1-W2 | -QQ-WWW | -Q1-W2 | -Q-WWW | -Q-W2 | 2024-Q1-W12 |
±CCYYQQWWW | ±4Q1W2 | QQWWW | Q1W2 | QWWW | QW2 | 2024Q1W12 | |
d/w/qw/y | ±CCYY-QQ-WWW-D | ±4-Q1-W2-1 | -QQ-WWW-D | -Q1-W2-1 | -Q-WWW-D | -Q-W2-1 | 2024-Q1-W12-4 |
±CCYYQQWWWD | ±4Q1W3 | QQWWWD | Q1W3 | QWWWD | QW3 | 2024Q1W124 | |
m/qw/y | ±CCYY-QQ-M | ±4-Q1-1 | -QQ-M | -Q1-1 | 2024-Q1-3 | ||
±CCYYQQM | ±4Q2 | QQM | Q2 | 2024Q13 | |||
d/m/qw/y | ±CCYY-QQ-M-DD | ±4-Q1-1-2 | -QQ-M-DD | -Q1-1-2 | 2024-Q1-3-20 | ||
±CCYYQQMDD | ±4Q4 | QQMDD | Q4 | 2024Q1320 | |||
w/m/q/y | ±CCYY-QQ-M-WW | ±4-Q1-1-W1 | -QQ-M-WW | -Q1-1-W1 | 2024-Q1-3-W3 | ||
±CCYYQQMWW | ±4Q2W1 | QQMWW | Q2W1 | 2024Q13W3 | |||
d/w/m/q/y | ±CCYY-QQ-M-WW-D | ±4-Q1-1-W1-1 | -QQ-M-WW-D | -Q1-1-W1-1 | 2024-Q1-3-W3-4 | ||
±CCYYQQMWWD | ±4Q2W2 | QQMWWD | Q2W2 | 2024Q13W34 | |||
4-week moons | |||||||
m13/y | ±CCYY-MMM | ±4-M2 | -MMM | -M2 | 2024-M03 | ||
±CCYYMMM | ±4M2 | MMM | M2 | 2024M03 | |||
d/m13/y | ±CCYY-MMM-DD | ±4-M2-2 | -MMM-DD | -M2-2 | -M-DD | -M-2 | 2024-M03-25 |
±CCYYMMMDD | ±4M4 | MMMDD | M4 | invalid | 2024M0325 | ||
w/m13/y | ±CCYY-MMM-WW | ±4-M2-W1 | -MMM-WW | -M2-W1 | -M-WW | -M-W1 | 2024-M03-W4 |
±CCYYMMMWW | ±4M2W1 | MMMWW | M2W1 | MWW | MW1 | 2024M03W4 | |
d/w/m13/y | ±CCYY-MMM-WW-D | ±4-M2-W1-1 | -MMM-WW-D | -M2-W1-1 | -M-WW-D | -M-W1-1 | 2024-M03-W4-4 |
±CCYYMMMWWD | ±4M2W2 | MMMWWD | M2W2 | MWWD | MW2 | 2024M03W44 |
The week year used herein has exactly 52 weeks (364 days) in a short year or 53 weeks (371 days) in a long year. The term normal year is ambiguous, as it means a short year in the context of week years and a common year in the context of month years.
There is no format which allows to specify the ordinal day of a week year (001 through 364 or 371), although that was possible, e.g. as ±CCYY-DDDD. Three consecutive digits after the marker ‘W’ are already used by the condensed format WWWD.
W01 | W02 | W03 | W04 | W05 | W06 | W07 | W08 | W09 | W10 | W11 | W12 | W13 | W14 | W15 | W16 | W17 | W18 | W19 | W20 | W21 | W22 | W23 | W24 | W25 | W26 | W27 | W28 | W29 | W30 | W31 | W32 | W33 | W34 | W35 | W36 | W37 | W38 | W39 | W40 | W41 | W42 | W43 | W44 | W45 | W46 | W47 | W48 | W49 | W50 | W51 | W52 |
Q1 | Q2 | Q3 | Q4 | ||||||||||||||||||||||||||||||||||||||||||||||||
Q11 | Q12 | Q13 | Q21 | Q22 | Q23 | Q31 | Q32 | Q33 | Q41 | Q42 | Q43 | ||||||||||||||||||||||||||||||||||||||||
M01 | M02 | M03 | M04 | M05 | M06 | M07 | M08 | M09 | M10 | M11 | M12 | M13 |
- Week year
- ±CCYYW
Quart: 13-week quarters[]
Month | Week | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|---|
Mon | Tue | Wed | Thu | Fri | Sat | Sun | ||
1 | W01 | 01 | 02 | 03 | 04 | 05 | 06 | 07 |
W02 | 08 | 09 | 10 | 11 | 12 | 13 | 14 | |
W03 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | |
W04 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | |
2 | W05 | 29 | 30 | 31 | 32 | 33 | 34 | 35 |
W06 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | |
W07 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | |
W08 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | |
W09 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | |
3 | W10 | 64 | 65 | 66 | 67 | 68 | 69 | 70 |
W11 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | |
W12 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | |
W13 | 85 | 86 | 87 | 88 | 89 | 90 | 91 |
Month | Week | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|---|
Mon | Tue | Wed | Thu | Fri | Sat | Sun | ||
1 | W1 | 01 | 02 | 03 | 04 | 05 | 06 | 07 |
W2 | 08 | 09 | 10 | 11 | 12 | 13 | 14 | |
W3 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | |
W4 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | |
2 | W1 | 29 | 30 | 01 | 02 | 03 | 04 | 05 |
W2 | 06 | 07 | 08 | 09 | 10 | 11 | 12 | |
W3 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | |
W4 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | |
W5 | 27 | 28 | 29 | 30 | 31 | 01 | 02 | |
3 | W1 | 03 | 04 | 05 | 06 | 07 | 08 | 09 |
W2 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | |
W3 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | |
W4 | 24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Alphanumeric date format
- ‘Q’ marker
- Quart year
- ±CCYYQ
- Quart of year
- ±CCYY-QQ, ±CCYYQQ, -QQ, QQ
- Day of quart
- ±CCYY-QQ-DD, ±CCYYQQDD, -QQ-DD, QQDD, -Q-DD
- Week of quart
- ±CCYY-QQ-WWW, ±CCYYQQWWW, -QQ-WWW, QQWWW, -Q-WWW, QWWW
- Day of Week
- ±CCYY-QQ-WWW-D, ±CCYYQQWWWD, -QQ-WWW-D, QQWWWD, -Q-WWW-D, QWWWD
- Month of quart
- ±CCYY-QQ-M, ±CCYYQQM, -QQ-M, QQM
- Day of month
- ±CCYY-QQ-M-DD, ±CCYYQQMDD, -QQ-M-DD, QQMDD
- Week of month
- ±CCYY-QQ-M-WW, ±CCYYQQMWW, -QQ-M-WW, QQMWW
- Day of month
- ±CCYY-QQ-M-WW-D, ±CCYYQQMWWD, -QQ-M-WW-D, QQMWWD
Each of the 4 quarters, called quarts, has 13 weeks excatly, except for the final one in long years. This long quart has 14 weeks then.
Although there is no consensus on how quarts of 91 days or 13 weeks should be separated into 3 months of almost equal length, there are just two basic approaches: one divides each quarter into portions of 30 days twice and 31 days once, the other uses 4 weeks twice and 5 weeks once. Choosing the former, the Common-Civil-Calendar-and-Time calendar, the Hanke-Henry Permanent Calendar, the ISO-Uncia Leap Week Calendar and the Edwards perpetual calendar all use 30:30:31 days, the Symmetry010 Calendar uses 30:31:30 days and the Aristean Calendar uses 31:30:30 days. When the “Thursday rule” is applied to any of these patterns it always results in a week layout of 4:5:4 as in the Symmetry454 Calendar, i.e. neither 5:4:4 as in the Bonavian Civil Calendar nor 4:4:5. Months of quarts, furthermore, cannot match exactly the full-week months determined by the week date (-MM-WW or -Q-M-WW), because the first triad may have just 12 weeks and the third triad may also have 14 weeks (like the fourth).
Quarts are therefore divided into three months that primarily consists of 4, 5 and 4 weeks (-QQ-M-WW-D) and, matching that middle-high scheme, alternatively they consist of 30, 31 and 30 days (-QQ-M-DD). Without weeks or days provided, i.e. in the form -QQ-M, there is no distinction between these – the month duality. There is no way to reference a day in 28|35-day months without its week.
‘W’ instead of ‘Q’ as a marker for quarts would work, too, but not as well for some (condensed) formats. Also, it may be counter-intuitive to have “W1” not mean the first week of a month.
Moon: 13 months[]
Week | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
Mon | Tue | Wed | Thu | Fri | Sat | Sun | |
W1 | 01 | 02 | 03 | 04 | 05 | 06 | 07 |
W2 | 08 | 09 | 10 | 11 | 12 | 13 | 14 |
W3 | 15 | 16 | 17 | 18 | 19 | 20 | 21 |
W4 | 22 | 23 | 24 | 25 | 26 | 27 | 28 |
- Alphanumeric date format
- ‘M’ marker
- Moon year
- ±CCYYM
- Moon of year
- ±CCYY-MMM, ±CCYYMMM, -MMM, MMM
- Day of moon
- ±CCYY-MMM-DD, ±CCYYMMMDD, -MMM-DD, MMMDD, -M-DD
- Week of moon
- ±CCYY-MMM-WW, ±CCYYMMMWW, -MMM-WW, MMMWW, -M-WW, MWW
- Day of week
- ±CCYY-MMM-WW-D, ±CCYYMMMWWD, -MMM-WW-D, MMMWWD, -M-WW-D, MWWD
The week year is divided into 13 months, called moons. A normal moon has 4 complete weeks (28 days). The last moon in long years is a long moon and has 5 weeks (35 days). Since there is a leap week instead of intercalary days, these moons align with the week year, not the month year.
This format is compatible with the New Earth Calendar, which uses a custom leap rule though, and differs from the International Fixed Calendar (Cotsworth–Eastman plan), which uses intercalary days and starts weeks on Sunday.
With alternative leap rules, there can be a 13-moon year with an additional leap moon every 22 or 23 years, but this does not work with a 400-year leap cycle, because it does not contain an integer multiple of 28 days. The 293-year cycle, however, would contain exactly 13 leap moons. Another leap rule may use an independent year count for moon years, of which there are 294 in a cycle of 293 week or month years. There would be no long moons in either case.
Moon | Celtic Zodiac | Nature | Weather | Culture | Color |
---|---|---|---|---|---|
M01 | 🦌 Stag / Deer | Wolf | Ice | Old | ⚪ Gray |
M02 | 🐱 Cat | Snow, Storm | Hunger | ⚪ White | |
M03 | 🐍 Snake / Adder | Worm, Crow, Crust, Sugar | (Thaw, Melt) | Lenten, Chaste, Sap | 🟢 Lime |
M04 | 🦊 Fox | Grass, Fish, Hare, Egg | (Breeze) | Paschal | 🔴 Pink, Magenta, Fuchsia |
M05 | 🐮 Bull / Cow | Flower, Milk, Birch | (Bloom, Blossom, Joy) | 🟢 Green | |
M06 | 🐲 Seahorse / (Dragon) | Strawberry, Rose | Hot, Heat | Mead | 🟣🔴 Rose, Lilac |
M07 | 🐦 Wren / Bird | Buck, Wort | Thunder | Hay | ⚪🔵 Silver, Cyan, Light |
M08 | 🐴 Horse / (Unicorn) | Sturgeon, Fruit, Grain | 🟡 Gold, Yellow | ||
M09 | 🐟 Salmon / Fish | Corn, Barley | Harvest | 🟤🟠 Brown, Orange, Olive | |
M10 | 🦢 Swan | Wine | (Windy) | (Vintage) | 🔵 Blue |
M11 | 🦋 Butterfly | Leaf | (Foggy) | Hunter's, Blood, Sanguine | 🔴 Red |
M12 | 🐺 Wolf / Hound | Beaver, Oak | Frosty | Mourning | 🟣 Purple |
M13 | 🦅 Hawk / Falcon / (Eagle) | Cold | Yule | ⚫ Black, Dark |
Mixed additions and clarifications[]
level of detail | full date | year implied | more implied | (full) sample | |||
---|---|---|---|---|---|---|---|
w/q/y | ±CCYY-Q-WWW | ±4-1-W2 | -Q-WWW | -1-W2 | 2024-1-W12 | ||
d/w/q/y | ±CCYY-Q-WWW-D | ±4-1-W2-1 | -Q-WWW-D | -1-W2-1 | 2024-1-W12-4 | ||
w/m/y | ±CCYY-MM-WW | ±4-2-W1 | -MM-WW | -2-W1 | --WW | --W1 | 2024-03-W4 |
d/w/m/y | ±CCYY-MM-WW-D | ±4-2-W1-1 | -MM-WW-D | -2-W1-1 | --WW-D | --W1-1 | 2024-03-W4-4 |
Week of month or of triad[]
1 Jan: | Mon | Tue | Wed | Thu | Fri | Sat | Sun | usual |
---|---|---|---|---|---|---|---|---|
-01 | 4 | 5 | 5 | 5 | 4 | 4 | 4 | 57% |
-02 | 4+ | 4 | 4 | 4 | 4 | 4 | 4 | 96¾% |
-03 | 5– | 4 | 4 | 4 | 4+ | 5 | 5 | 57% |
-04 | 4 | 4 | 4+ | 5 | 5– | 4 | 4 | 71½% |
-05 | 5 | 5 | 5– | 4 | 4 | 4 | 4+ | 57% |
-06 | 4 | 4 | 4 | 4 | 4+ | 5 | 5– | 67¾% |
-07 | 4 | 4+ | 5 | 5 | 5– | 4 | 4 | 57¼% |
-08 | 5 | 5– | 4 | 4 | 4 | 4+ | 5 | 57¼% |
-09 | 4 | 4 | 4 | 4+ | 5 | 5– | 4 | 71½% |
-10 | 4+ | 5 | 5 | 5– | 4 | 4 | 4 | 57% |
-11 | 5– | 4 | 4 | 4 | 4 | 4+ | 5 | 71½% |
-12 | 4 | 4 | 4+ | 5 | 5 | 5– | 4 | 57% |
Year | 52 | 52 | 52+ | 53 | 52 | 52 | 52 | 82¼% |
-1 | 13 | 13 | 13 | 13 | 12+ | 13 | 13 | 89¼% |
-2 | 13 | 13 | 13 | 13 | 13 | 13 | 13 | 100% |
-3 | 13 | 13 | 13 | 13+ | 14– | 13 | 13 | 86% |
-4 | 13 | 13 | 13+ | 14– | 13 | 13 | 13 | 85½% |
- Alphanumeric date format
- ‘W’ marker
- Week of triad
- ±CCYY-Q-WWW, -Q-WWW
- Day of week
- ±CCYY-Q-WWW-D, -Q-WWW-D
- Week of month
- ±CCYY-MM-WW, -MM-WW, --WW
- day of week
- ±CCYY-MM-WW-D, -MM-WW-D, --WW-D
The number of weeks per month, hence triads, is determined by the usual Thursday rule, that means a week belongs to the month (or triad) the majority of its days (4 to 7) fall into, this always includes its Thursday.
A short month has 4 weeks, a long month has 5 weeks. There are 4 long months in normal years and 5 ones in 53-week long years. The term normal monthis only used for Gregorian months of 28 to 31 days. A month has 5 weeks if it has at least 29 days and starts on Thursday, has at least 30 days and starts on Wednesday, or has 31 days and starts on Tuesday. The resulting pattern is irregular.
The first triad may have just 12 weeks (short triad), the second always has 13 weeks (normal triad) and either the third or the fourth may, instead of 13, have 14 weeks (long triad).
Note that triads and normal months divided into full weeks together effectively constitute the week year and not the month year. To put it differently: every date with a ‘W’ marker in it uses the week year.
Other subdivisions[]
- This subsection is optional.
level of detail | full date | year implied | ||
---|---|---|---|---|
pentad | ||||
d/w/y | ±CCYY-PWW-D | ±4-P2-1 | -PWW-D | -P2-1 |
±CCYYPWWD | ±4P3 | PWWD | P3 | |
w/y | ±CCYY-PWW | ±4-P2 | -PWW | -P2 |
±CCYYPWW | ±4P2 | PWW | P2 | |
hexad | ||||
d/w/y | ±CCYY-HWW-D | ±4-H2-1 | -HWW-D | -H2-1 |
±CCYYHWWD | ±4H3 | HWWD | H3 | |
w/y | ±CCYY-HWW | ±4-H2 | -HWW | -H2 |
±CCYYHWW | ±4H2 | HWW | H2 | |
octad | ||||
d/w/y | ±CCYY-OWW-D | ±4-O2-1 | -OWW-D | -O2-1 |
±CCYYOWWD | ±4O3 | OWWD | O3 | |
w/y | ±CCYY-OWW | ±4-O2 | -OWW | -O2 |
±CCYYOWW | ±4O2 | OWW | O2 | |
nonad | ||||
d/w/y | ±CCYY-NWW-D | ±4-N2-1 | -NWW-D | -N2-1 |
±CCYYNWWD | ±4N3 | NWWD | N3 | |
w/y | ±CCYY-NWW | ±4-N2 | -NWW | -N2 |
±CCYYNWW | ±4N2 | NWW | N2 |
- 360 is divisible by a lot of factors: 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 18, 20, 24, 30, 36, 40, 45, 60, 72, 90, 120 and 180.
- 364 has fewer divisors: 2, 4, 7, 13, 28, 52, 91 and 182.
- 365 has even less: just 5 and 73.
- 366 has some more factors: 2, 3, 6, 61, 122 and 183.
That means it would be feasible to use a different length of the week than 7 days, but the leap problems remain. So, for instance, one could either have 61 full weeks of 6 days in most years and just 60 in some or 60 full weeks and 5 dangling days in most years, which could either belong to no “week” or to the last and first weeks of adjacent years by the majority rule (“Thursday rule”).
Besides the common 7-day week, the International Calendar recognizes weeks of 5, 6, 8 and 9 days. They are called pentad (5 days), hexad (6), octad (8) and nonad (9) and their markers hence are P, H, O (although not a preferred character) and N. A decade of 10 days, as in the French Republican calendar could be included, too, but is treated as a near superset of the pentad instead. Likewise, hexads or nonads include 3-day weeks and octads render 4-day weeks unnecessary, although it could have been the other way around as well.
Currently, the only supported date formats are ±CCYY-<marker>WW and ±CCYY-<marker>WW-D for all four types.
The common pentad year is the same length as the common year, i.e. 365 days divided into 73 pentads, but the leap pentad year is 370 days in 74 pentads. The start of the year usually does not align with the normal years. The relation to normal years repeats only after 2000 years because the number of days in the Gregorian leap cycle is not divisible by 5.
The common hexad year is unusual in that it is 1 day longer than the common year of 365 days, so its 366 days make 61 hexads. In leap hexad years, 1 hexad is dropped so that it is the same length as a common nonad year, with 360 days. A hexad belongs to the year which holds most of its days; if it’s split in parts of 3 days, it belongs to the later year. The relation to normal years repeats after 800 years because 146097 is divisible by 3 but not by 2.
A short octad year is once again 360 days long and contains 45 octads. A long octad year has 46 octads in 368 days. (If there were 4-day weeks, they would of course fit nicely into this and a short year of 364 days.) Like for hexads, an octad split into parts of 4 days across the year boundary, belongs to the later year. It would take 3200 years until the pattern repeats.
There are exactly 16233 nonads per 400-year Gregorian leap cycle. A common nonad year is 360 days, i.e. 40 nonads, a leap nomad year has 41 nonads (369 days). Each era contains 33 leap nonads. Their position depends on the Gregorian leap rule since a nonad belongs to the year that 5 or more of its days belong to. Since only 9-day (and 3-day) weeks fit nicely into the Gregorian leap cycle, they are the preferred alternative subdivision. (There would even be an even number of 27-day months, 5411.)
In conclusion, there are years of 360, 364, 365, 366, 368, 370 and 371 days in the International Calendar.
Financial and administrative additions[]
- This section is optional.
Fiscal quarters, months and year[]
level of detail | full date | year implied | ||
---|---|---|---|---|
y30 | ±CCYYF | ±4F | ||
q/y | ±CCYY-FQ | ±4-F1 | -FQ | -F1 |
±CCYYFQ | ±4F1 | FQ | F1 | |
m/y | ±CCYY-FMM | ±4-F2 | -FMM | -F2 |
±CCYYFMM | ±4F2 | FMM | F2 | |
d/y | ±CCYY-FDDD | ±4-F3 | -FDDD | -F3 |
±CCYYFDDD | ±4F3 | FDDD | F3 | |
d/m/y | ±CCYY-FMM-DD | ±4-F2-2 | -FMM-DD | -F2-2 |
±CCYYFMMDD | ±4F4 | FMMDD | F4 |
- Alphanumeric date format
- ‘F’ marker
Each of the 12 fiscal months has exactly 30 days, hence the fiscal year 360 days. Each of the four fiscal quarters in a year by default has 90 days in it. All start and end dates, hence exact lengths, may be user-defined.
The week is not used with this format!
Todo: Decide whether this mapping is sensible.
Month F00 and quarter F0 contain 5 days in common years and 6 days in leap years. When mapping to the Gregorian calendar, they represent the 31st days of May, July, August, October and December as well as the 29th day of February. The last two days of the fiscal month closest matching February map to the 31st days of January and March.
Fiscal date | Standard date | |
---|---|---|
F00-01 | F0-01 | -05-31 |
F00-02 | F0-02 | -07-31 |
F00-03 | F0-03 | -08-31 |
F00-04 | F0-04 | -10-31 |
F00-05 | F0-05 | -12-31 |
F00-06 | F0-06 | -02-29 |
F02-29 | F1-59 | -01-31 |
F02-30 | F1-60 | -03-31 |
Fiscal dates are therefore not strictly consecutive!
Academic year and terms[]
- under construction
Semesters | ||||
---|---|---|---|---|
level of detail | full date | year implied | ||
h/y | ±CCYY-HH | ±4-H1 | -HH | -H1 |
±CCYYHH | ±4H1 | HH | H1 | |
q/h/y | ±CCYY-HH-QQ | ±4-H1-Q1 | -HH-QQ | -H1-Q1 |
±CCYYHHQQ | ±4H1Q1 | HHQQ | H1Q1 | |
m/h/y | ±CCYY-HH-M | ±4-H1-1 | -HH-M | -H1-1 |
±CCYYHHM | ±4H2 | HHM | H2 | |
w/h/y | ±CCYY-HH-WWW | ±4-H1-W2 | -HH-WWW | H1-W2 |
±CCYYHHWWW | ±4H1W2 | HHWWW | H1W2 | |
w/q/h/y | ±CCYY-HH-QQ-WWW | ±4-H1-Q1-W2 | -HH-QQ-WWW | H1-Q1-W2 |
±CCYYHHQQWWW | ±4H1Q1W2 | HHQQWWW | H1Q1W2 | |
d/m/h/y | ±CCYY-HH-M-DD | ±4-H1-1-2 | -HH-M-DD | -H1-1-2 |
±CCYYHHMDD | ±4H4 | HHMDD | H4 | |
d/w/h/y | ±CCYY-HH-WWW-D | ±4-H1-W2-1 | -HH-WWW-D | H1-W2-1 |
±CCYYHHWWWD | ±4H1W3 | HHWWWD | H1W3 | |
d/w/q/h/y | ±CCYY-HH-QQ-WWW-D | ±4-H1-Q1-W2-1 | -HH-QQ-WWW-D | H1-Q1-W2-1 |
±CCYYHHQQMWWWD | ±4H1Q1W3 | HHQQWWWD | H1Q1W3 | |
Academic terms | ||||
level of detail | full date | year implied | ||
t/y | ±CCYY-AT | ±4-A1 | -AT | -A1 |
±CCYYAT | ±4A1 | AT | A1 | |
m/t/y | ±CCYY-AT-M | ±4-A1-1 | -AT-M | -A1-1 |
±CCYYATM | ±4A2 | ATM | A2 | |
m/t/y | ±CCYY-AT-MM | ±4-A1-M1 | -AT-MM | -A1-M1 |
±CCYYATMM | ±4A1M1 | ATMM | A1M1 | |
w/t/y | ±CCYY-AT-WWW | ±4-A1-W2 | -AT-WWW | -A1-W2 |
±CCYYATWWW | ±4A1W2 | ATWWW | A1W2 | |
w/m/t/y | ±CCYY-AT-MM-WW | ±4-A1-M1-W1 | -AT-MM-WW | -A1-M1-W1 |
±CCYYATMMWW | ±4A1M1W1 | ATMMWW | A1M1W1 | |
d/m/t/y | ±CCYY-AT-M-DD | ±4-A1-1-2 | -AT-M-DD | -A1-1-2 |
±CCYYATMDD | ±4A4 | ATMDD | A4 | |
d/w/t/y | ±CCYY-AT-WWW-D | ±4-A1-W2-1 | -AT-WWW-D | -A1-W2-1 |
±CCYYATWWWD | ±4A1W3 | ATWWWD | A1W3 |
Note: also see Academic Calendar
Half-year semesters and third-year trimesters are only really useful with an academic year signifier, e.g. ‘A’, that changes the start of the year to 1 September, for instance, because when the academic year starts in fall as is common on the Northern hemisphere, semesters do not work well with the standard Gregorian calendar, since most days of the first (winter) semester would lie in the preceding year, but should belong to the succeeding one.
Todo: Remove unnecessary and ambiguous formats
EDTF and ISO 8601-2, introduced after IC, use the month format CCYY-MM to encode other subdivisions of the year, including quarters and semestrals, as arbitrary two-digit numbers.
IC | EDTF | Description | Type |
---|---|---|---|
– | 21 | Spring | independent of location |
– | 22 | Summer | |
– | 23 | Autumn | |
– | 24 | Winter | |
S2 | 25 = 31 | Spring | Northern Hemisphere |
S3 | 26 = 32 | Summer | |
S4 | 27 = 29 | Autumn | |
S1 | 28 = 30 | Winter | |
S4 | 29 = 27 | Spring | Southern Hemisphere |
S1 | 30 = 28 | Summer | |
S2 | 31 = 25 | Autumn | |
S3 | 32 = 26 | Winter | |
-1, H1Q1 | 33 | Quarter 1 | 3 months in duration |
-2, H1Q2 | 34 | Quarter 2 | |
-3, H2Q1 | 35 | Quarter 3 | |
-4, H2Q2 | 36 | Quarter 4 | |
A1 | 37 | Quadrimester 1 | 4 months in duration |
A2 | 38 | Quadrimester 2 | |
A3 | 39 | Quadrimester 3 | |
H1 | 40 | Semestral 1 | 6 months in duration |
H2 | 41 | Semestral 2 |
Semesters[]
- half of a year
- 6 months (181*:184 days)
- 26:26* weeks (182:182|189 days)
- 2 quarts (26:26* weeks)
- 182*:183 days
The division of semesters into two quarts – or trimesters – each, HH-QQ, is supported, although “quarters of halves” might seem strange at first since quarters are usually halves of halves. Triads, HH-Q , would conflict with months, HH-M, nevertheless and are not supported.
Moons of semesters, HH-MM, are not supported, because 13 moons do not fit well in 2 halves. Months of any kind are also mostly meaningless for academic applications, weeks are far more important.
Quadrimesters[]
- third of a year
- 4 months (120*:123:122 days) or
- 4:5:4* moons (16:20:16|20 weeks = 112:140:112|140 days)
- 17:18:17* weeks (119:126:119|126 days) or
- 121:122:121* days
There is no good marker available for quadrimesters or terms: ‘Q’ is taken by quarts, ‘T’ is taken by times. Possible fallback solutions are “Year” Y ⇒ “A2012Y”, “Education” E or “Academic” A – ‘A’ is used for now as marker, but ‘T’ is used as a variable.
Quarters of quadrimesters are not supported, because they are of similar length.
Astronomic and astrologic additions[]
- This section is optional.
- SMM not in Grammar yet
Lunar dates | ||||||
---|---|---|---|---|---|---|
level of detail | full date | year implied | ||||
yL | ±CCYYL | ±4L | ||||
m/y | ±CCYY-LMM | ±4-L2 | -LMM | -L2 | ||
±CCYYLMM | ±4L2 | LMM | L2 | |||
d/m/y | ±CCYY-LMM-DD | ±4-L2-2 | -LMM-DD | -L2-2 | ||
±CCYYLMMDD | ±4L4 | LMMDD | L4 | |||
dw/m/y | ±CCYY-LMM-W-D | ±4-L2-1-1 | -LMM-W-D | -L2-1-1 | ||
invalid | invalid | |||||
Seasonal dates | ||||||
level of detail | full date | year implied | more implied | |||
yS | ±CCYYS | ±4S | ||||
q/y | ±CCYY-SQ | ±4-S1 | -SQ | -S1 | ||
±CCYYSQ | ±4S1 | SQ | S1 | |||
d/q/y | ±CCYY-SQ-DD | ±4-S1-2 | -SQ-DD | -S1-2 | ||
±CCYYSQDD | ±4S3 | SQDD | S3 | |||
m/q/y | ±CCYY-SQ-M | ±4-S1-1 | -SQ-M | -S1-1 | -S-M | -S-1 |
invalid | invalid | invalid | ||||
m/y | ±CCYY-SMM | ±4-S2 | -SMM | -S2 | ||
±CCYYSMM | ±4S2 | SMM | S2 | |||
d/m/y | ±CCYY-SMM-DD | ±4-S2-2 | -SMM-DD | -S2-2 | ||
±CCYYSMMDD | ±4S4 | SMMDD | S4 |
Note: ±CCYYL and ±CCYYS are not the same.
Lunar year and months[]
- Alphanumeric date format
- ‘L’ marker
- Lunar year
- ±CCYYL
- Lunation
- ±CCYY-LMM, ±CCYYLMM, -LMM, LMM
- Day of lunation
- ±CCYY-LMM-DD, ±CCYYLMMDD, -LMM-DD, LMMDD
- Weekday of lunation
- ±CCYY-LMM-W-D, -LMM-W-D
A lunar month or lunation has 29 or 30 days and is astronomically defined from new moon to new moon at 0° 0°. A day belongs to the lunation the majority of its hours belong to. Likewise, a lunar month belongs to the month year the majority of its days (15 to 30) fall into; in the unlikely case of a 30-day month with 15 days in both years it belongs to the year most of its weeks belong to. The lunar year therefore contains either 12 or 13 complete lunar months.
The Jewish or Hebrew year is closely related to this except that both its month numbering variants are different, as is the point of astronomic reference. The lunar calendar implied by the Christian Easter Computus is similar in that its Easter month almost always matches Hebrew Nisan.
ILC | Short year without leap month | Long year with leap month | Early short year without leap month | Early long year with leap month | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Name | Civil | Religious | Length | Name | Civil | Religious | Length | Name | Civil | Religious | Length | Name | Civil | Religious | Length | |
L01 | Shevat | 05 | 11 | 29 | Shevat | 05 | 11 | 29 | Tevet | 04 | 10 | 29 | Tevet | 04 | 10 | 29 |
L02 | Adar | 06 | 12 | 30 | Adar I | 06 | 12 | 30 | Shevat | 05 | 11 | 29 | Shevat | 05 | 11 | 29 |
L03 | Nisan | 07 | 01 | 30 | Adar II | 06 | 12 | 29 | Adar | 06 | 12 | 30 | Adar I | 06 | 12 | 30 |
L04 | Iyar | 08 | 02 | 29 | Nisan | 07 | 01 | 30 | Nisan | 07 | 01 | 30 | Adar II | 06 | 12 | 29 |
L05 | Sivan | 09 | 03 | 30 | Iyar | 08 | 02 | 29 | Iyar | 08 | 02 | 29 | Nisan | 07 | 01 | 30 |
L06 | Tammuz | 10 | 04 | 29 | Sivan | 09 | 03 | 30 | Sivan | 09 | 03 | 30 | Iyar | 08 | 02 | 29 |
L07 | Av | 11 | 05 | 30 | Tammuz | 10 | 04 | 29 | Tammuz | 10 | 04 | 29 | Sivan | 09 | 03 | 30 |
L08 | Elul | 12 | 06 | 29 | Av | 11 | 05 | 30 | Av | 11 | 05 | 30 | Tammuz | 10 | 04 | 29 |
L09 | Tishrei | 01 | 07 | 30 | Elul | 12 | 06 | 29 | Elul | 12 | 06 | 29 | Av | 11 | 05 | 30 |
L10 | Cheshvan | 02 | 08 | 29/30 | Tishrei | 01 | 07 | 30 | Tishrei | 01 | 07 | 30 | Elul | 12 | 06 | 29 |
L11 | Kislev | 03 | 09 | 30/29 | Cheshvan | 02 | 08 | 29/30 | Cheshvan | 02 | 08 | 29/30 | Tishrei | 01 | 07 | 30 |
L12 | Tevet | 04 | 10 | 29 | Kislev | 03 | 09 | 30/29 | Kislev | 03 | 09 | 30/29 | Cheshvan | 02 | 08 | 29/30 |
L13 | — | — | — | — | Tevet | 04 | 10 | 29 | — | — | — | — | Kislev | 03 | 09 | 30/29 |
The various Muslim or Islamic Hijri calendars in current use always have 12 months per year, although previous local calendars did have intercalation (Nasi’). In the Tabular Islamic calendar, there are alternating 30:29 days in a month, and the final, twelfth month has 30 days in a leap year which happens 11 times in each 30-year leap cycle (by one of several established patterns). Their mapping to L01 through L12 or L13 therefore differs every year from the previous one.
The traditional Chinese lunisolar calendar also has the full moon in the middle of each month. Its year usually starts with the second new moon after the Northern winter solstice. Each month can be repeated as a leap month and has either 29 or 30 days. The traditional division of a month into three week-like periods, called 旬 (xún, jun, sun), of 10ish days each is not supported (yet). The Chinese solar terms or – incorrectly – “fortnights”, i.e. half-Zodiacs lasting a 15° portion of the ecliptic, which is 15 or 16 days, are not supported (yet) either; see next subsection.
ILC | Modern number | Phenological | Earthly branch | |||
---|---|---|---|---|---|---|
L01 | 12 | 臘/腊 | 冰 ‘ice’ | 02 | 丑 | 🐮🐂 ‘ox, bull’, 🐄 ‘cow’, 🐃 ‘(water) buffalo’ |
L02 | 01 | 正 | 陬 ‘corner’ | 03 | 寅 | 🐯🐅 ‘tiger’, 🐆 ‘leopard’ / 🐺 ‘wolf’ |
L03 | 02 | 二 | 杏 ‘apricot’ | 04 | 卯 | 🐰🐇 ‘rabbit, hare’ / 🐱🐈 ‘cat’ |
L04 | 03 | 三 | 桃 ‘peach’ | 05 | 辰 | 🐲🐉 ‘dragon’ / 🐊 ‘crocodile’ / 🐟 ‘fish’ / 🐳🐋 ‘whale’ / 🦈 ‘shark’ / 🦛 ‘hippopotamus’ / 🐌 ‘snail’ / 🦅 ‘eagle’ |
L05 | 04 | 四 | 梅 ‘plum’ | 06 | 巳 | 🐍 ‘snake, serpent’ |
L06 | 05 | 五 | 榴 ‘pomegranate’ | 07 | 午 | 🐴🐎 ‘horse’ |
L07 | 06 | 六 | 荷 ‘lotus’ | 08 | 未 | 🐐 ‘goat’, 🐑🐏 ‘sheep, ram’ |
L08 | 07 | 七 | 蘭/兰 ‘orchid’ | 09 | 申 | 🐵🐒 ‘monkey’ / 🐢 ‘turtle’ / 🦔 ‘hedgehog’ |
L09 | 08 | 八 | 桂 ‘osmanthus’ | 10 | 酉 | 🐔🐓 ‘rooster, chicken, hen’ / 🐦 ‘bird‘ |
L10 | 09 | 九 | 菊 ‘chrysanthemum’ | 11 | 戌 | 🐶🐕 ‘dog’ |
L11 | 10 | 十 | 露 ‘dew’ | 12 | 亥 | 🐷🐖 ‘pig, hog’, 🐗 ‘boar’ / 🐘 ‘elephant’ / 🫎 ‘deer’ / 🐢 ‘tortoise’ |
L12 | 11 | 冬 | 冬 ‘winter’ / 葭 ‘reed’ |
01 | 子 | 🐭🐀 ‘rat’, 🐁 ‘mouse’ / 🐫🐪 ‘camel’ |
L13 | ##+ | — | — | — | — | — |
The week is not used with this format, but the ordinal days of the lunar month may be alternatively identified by being the nth weekday of a kind in that month.
Astronomic year and seasons, astrologic signs[]
- Alphanumeric date format
- ‘S’ marker
Season | S1 | S2 | S3 | S4 | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
North | winter | spring | summer | fall/autumn | ||||||||||||||||||||
South | summer | fall/autumn | winter | spring | ||||||||||||||||||||
Color | 🟥 red | 🟦 blue | 🟨 yellow | 🟩 green | ||||||||||||||||||||
Suit | ♥️ hearts | ♠️ spades | ♦️ diamonds | ♣️ clubs | ||||||||||||||||||||
Element | 🔥🜂 fire | 💧🜄 water | 🌬️🜁 air | 🪨🜃 earth | ||||||||||||||||||||
🪨🜃 | 🌬️🜁 | 💧🜄 | 🔥🜂 | 🪨🜃 | 🌬️🜁 | 💧🜄 | 🔥🜂 | 🪨🜃 | 🌬️🜁 | 💧🜄 | 🔥🜂 | |||||||||||||
Sign of season | S1-1 | S1-2 | S1-3 | S2-1 | S2-2 | S2-3 | S3-1 | S3-2 | S3-3 | S4-1 | S4-2 | S4-3 | ||||||||||||
Zodiac sign | S01 | S02 | S03 | S04 | S05 | S06 | S07 | S08 | S09 | S10 | S11 | S12 | ||||||||||||
♑ | ♒ | ♓ | ♈ | ♉ | ♊ | ♋ | ♌ | ♍ | ♎ | ♏ | ♐ | |||||||||||||
Capricorn | Aquarius | Pisces | Aries | Taurus | Gemini | Cancer | Leo | Virgo | Libra | Scorpius | Sagittarius | |||||||||||||
Solar term | 11z | 12j | 12z | 01j | 01z | 02j | 02z | 03j | 03z | 04j | 04z | 05j | 05z | 06j | 06z | 07j | 07z | 08j | 08z | 09j | 09z | 10j | 10z | 11j |
Climate term | 11 | 12 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | |||||||||||
Chinese, Celtic season | winter | spring | summer | fall/autumn | winter | |||||||||||||||||||
Wiccan tide | Yule | Imbolc | Ostara | Beltane | Litha | Lughnasa | Mabon | Samhain | ||||||||||||||||
Centered season | C4 | C1 | C2 | C3 | C4 | |||||||||||||||||||
C4-2 | C4-3 | C1-1 | C1-2 | C1-3 | C2-1 | C2-2 | C2-3 | C3-1 | C3-2 | C3-3 | C4-1 | C4-2 | ||||||||||||
C4-2-2 | C4-3-1 | C4-3-2 | C1-1-1 | C1-1-2 | C1-2-1 | C1-2-2 | C1-3-1 | C1-3-2 | C2-1-1 | C2-1-2 | C2-2-1 | C2-2-2 | C2-3-1 | C2-3-2 | C3-1-1 | C3-1-2 | C3-2-1 | C3-2-2 | C3-3-1 | C3-3-2 | C4-1-1 | C4-1-2 | C4-2-1 |
Note: EDTF uses ‘21’ though ‘24’ for local spring through winter, without specified start dates
- Astronomic year
- ±CCYYS
- Season
- ±CCYY-SQ, ±CCYYSQ, -SQ, SQ
- Day of season
- ±CCYY-SQ-DD, ±CCYYSQDD, -SQ-DD, SQDD
- Sign of season
- ±CCYY-SQ-M, -SQ-M, -S-M
- Sign
- ±CCYY-SMM, ±CCYYSMM, -SMM, SMM
- Day of sign
- ±CCYY-SMM-DD, ±CCYYSMMDD, -SMM-DD, SMMDD
Northern winter and Southern summer belongs to the Gregorian year most of its days fall into, therefore it is the first season of the year. This is the week of the year rule applied to seasons.
The four seasons begin on the days of solstices and equinoxes. The alternate definition where those are in the center of seasons is not supported and neither is another definition where seasons are comprised of the month of the solstice or equinox and the two following ones.
Todo: Decide how to handle zodiac signs.
It is not (yet) decided whether the seasons (and zodiacs) start at fixed dates relative to the Gregorian calendar or are based upon some accurate astronomic measurement or calculation. Zodiac signs always belong, however, to the season most of their days fall into.
Shifts[]
- under construction, not reflected in grammar yet
level of detail | full time | |
---|---|---|
t/d | T | 1 |
h/t/d | T:h | 1:1 |
invalid | ||
h/t/d | T:hh | 1:2 |
invalid | ||
m/t/d | T:mmm | 1:3 |
invalid |
level of detail | full date | year implied | more implied | |||
---|---|---|---|---|---|---|
t/w/y | ±CCYY-WWW-TT | ±4-W2-2 | YY-WWW-TT | 2-W2-2 | -WWW-TT | -W2-2 |
±CCYYWWWTT | ±4W4 | YYWWWTT | 2W4 | WWWTT | W4 | |
t/w/qw/y | ±CCYY-QQ-WWW-TT | ±4-Q1-W2-2 | -QQ-WWW-TT | -Q1-W2-2 | -Q-WWW-TT | -Q-W2-2 |
±CCYYQQWWWTT | ±4Q1W4 | QQWWWTT | Q1W4 | QWWWTT | QW4 | |
t/w/m/q/y | ±CCYY-QQ-M-WW-TT | ±4-Q1-1-W1-2 | -QQ-M-WW-TT | -Q1-1-W1-2 | ||
±CCYYQQMWWTT | ±4Q2W3 | QQMWWTT | Q2W3 | |||
t/w/m13/y | ±CCYY-MMM-WW-TT | ±4-M2-W1-2 | -MMM-WW-TT | -M2-W1-2 | -M-WW-TT | -M-W1-2 |
±CCYYMMMWWTT | ±4M2W3 | MMMWWTT | M2W3 | MWWTT | MW3 | |
t/w/q/y | ±CCYY-Q-WWW-TT | ±4-1-W2-2 | -Q-WWW-TT | -1-W2-2 | ||
invalid | invalid | |||||
t/w/m/y | ±CCYY-MM-WW-TT | ±4-2-W1-2 | -MM-WW-TT | -2-W1-2 | --WW-TT | --W1-2 |
invalid | invalid | invalid |
(Working) shifts or tours (T) are an economic measure ranging from few hours to a whole day. There are usually less than ten shifts in a day, i.e. one digit T suffices, but the actual length varies. Often, but not always, there is an integer number of shifts per day, e.g. 2 × 12h, 3 × 8h or 4 × 6h. There are often an integer number (usually larger than ten) of shifts in a (work) week, e.g. 24 × 7h, i.e., unlike for weekdays, two digits TT are necessary. Thus it is not obvious whether tours should be part of dates (…D-T, …WWW-TT) or times (…TTT). Only 24/7 shifts are supported explicitly.
Day partition[]
Comment: Time formats starting with TT would be confusable with hh if truncated, except when used with a new marker S.
If there is an integer number of shifts in 24 hours, their ordinal numbers (i.e. starting at 1!) follow the time marker in a single-digit field TT.
The exact number of shifts per day is only determined when more time fields are provided:
- A single-digit field TT:h is used for hour 0 through 7 for a three-shift pattern; minutes and seconds may follow as usual.
- A double-digit field TT:hh is used for hour 00 through 11 for a two-shift pattern; minutes and seconds may follow as usual.
- A triple-digit field TT:mmm is used for minute 000 through 359 for a four-shift pattern; seconds may follow as usual.
A shift starting one day and ending the next belongs to the day most of its hours belong to; if it is distributed equally, it belongs to the first day. A timezone offset ±hh:mm may be used to let the first shift of the work day start at 00:00 of the civil day.
Week partition[]
If there is an integer number of shifts in 7 days, their ordinal numbers follow the mandatory separator after a week number in a double-digit field WWW-TT or WW-TT. This is only a date format, not a date time format, i.e. the time marker and anything following it must not be used in this case! Implementations should assume 24 seven-hour shifts by default.
Templates work for individual needs. Users can define the ordinal and the total number of shifts:
- T<#/#>
- …D-<#/#>
- …WWW-<##/##>
Time[]
Existing formats[]
level of detail | full date | |
---|---|---|
h | hh | 2 |
m/h | hh:mm | 2:2 |
hhmm | 4 | |
s/m/h | hh:mm:ss | 2:2:2 |
hhmmss | 6 | |
f | .f | .1 … .9 |
,f | ,1 … ,9 | |
f/h | hh.f | 2.1 … 2.9 |
not applicable | ||
f/m/h | hh:mm.f | 2:2.1 … 2:2.9 |
hhmm.f | 4.1 … 4.9 | |
f/s/m/h | hh:mm:ss.f | 2:2:2.1 … 2:2:2.9 |
hhmmss.f | 6.1 … 6.9 |
Decimal time[]
Decimal time of day is valid without ‘T’ prefix: “.5” and “,5” mean 12:00:00. The decimal part (with comma) may also start after year, quarter (i.e. quart or triad), month (incl. moon), week and, of course, day. No further subdivisions are possible then.
level of detail | full time | |
---|---|---|
b | @bbb | @3 |
f/b | @bbb.f | @3.1 … @3.9 |
@bbb,f | @3,1 … @3,9 |
Dot Beat[]
Specifically, the Swatch Internet Time, or beat time, divides a day into 1000 beats, 000 through 999. This almost corresponds to T.fff, but this time format does not employ time zones and daylight saving times; its UTC offset is fixed to 1 hour: T.fff+01:00. To simplify this, the at marker @, already established, is introduced to imply these conventions, it replaces the T marker: @bbb. Furthermore, optional decimal subdivisions are possible as in @bbb.f.
Spreadsheets[]
Date-times compatible with most spreadsheet applications are not strings, but signed floating point numbers. The date is specified by a day-count from (when positive) or to (when negative) an 1900-01-01 epoch; ±i. The time is calculated as fractional part of the day and follows after the decimal marker (usually a dot, sometimes a comma) – it is therefore compatible with decimal time as specified above, ±i.f.
Please note that time arithmetic for negative dates is non-intuitive, e.g. half a day (0.5) added to (i.e. later than) -10.7 is -9.2 and neither -10.2 nor -11.2.
Conforming implementations must consider variable types when available:
- Number types must never be considered to be in any International Calendar date-time format.
- Strings must not be automatically converted to integers or floats to be treated as (fractional) days, but should be considered to be in an International Calendar date-time format.
- Untyped or mutable date-time variables should first be tried to match an International Calendar format and if that fails they may be reconsidered in the spreadsheet compatible format.
Partial hours[]
- under construction
45-minute interval | ||||
---|---|---|---|---|
level of detail | full time | first part implied | ||
t | Htt | H2 | — | |
15-minute interval | ||||
level of detail | full time | first part implied | ||
q | Cqq | C2 | — | |
s/q | Cqq:sss | C2:3 | :sss | :3 |
Cqqsss | C5 | invalid | ||
q/h | hh:q | 2:1 | :q | :1 |
invalid | invalid | |||
m/q/h | hh:q:mm | 2:1:2 | :q:mm | :1:2 |
hhqmm | 5 | invalid | ||
s/m/q/h | hh:q:mm:ss | 2:1:2:2 | :q:mm:ss | :1:2:2 |
hhqmmss | 7 | invalid | ||
5-minute interval | ||||
level of detail | full time | first part implied | ||
f | fff | 3 | — | |
s/f | fff:sss | invalid | invalid | |
invalid | ||||
3⅓-second part | ||||
level of detail | full time | first part implied | ||
p/h | hh:pppp | 2:4 | :pppp | :4 |
invalid | invalid |
Todo: Use S instead of H?
- Lesson
- Htt
In a normal day, there are 32 intervals three quarters of an hour (i.e. 45min) long. Since the hour itself does not need a marker, H is used for these. They are used in education of many countries, but do not need to be subdivided.
Comment: If it wasn’t for five-minute units, digit 0 could be used as a pseudo-marker for quarter-hours of the day.
- Quarter-hour of day
- Cqq
- Seconds of quarter-hour
- Cqq:sss, Cqqsss, :sss
With daylight savings time considered, there are up to one hundred quarter-hours of 900s (15min) per day Cqq:sss, but usually 96, counted from 00. Their marker is C, because Q is taken by quarters of years and it is mnemonic of centum, which is Latin for “hundred”.
- Quarter of hour
- hh:q, :q
- Minute of quarter-hour
- hh:q:mm, hhqmm, :q:mm
- Second of minute
- hh:q:mm:ss, hhqmmss, :q:mm:ss
There are 4 quarter-hours of 15min per hour hh:q:mm, counted from 0 through 3. They are used without a marker.
It is deliberately not possible to address anything in three-quarter hours, minutes in quarter-hours of the day and seconds (directly) in quarters of hours. All condensed formats without an explicit hour are invalid, even though some could be parsed unambiguously.
- 5-minute interval
- fff
- Second of 5min interval
- fff:sss
There are usually 288 intervals of 5 minutes in a day (twelfth-hours), numbered from 000 through 287 and subdivided into 300 seconds fff:sss.
- Part of hour
- hh:pppp, :pppp
- Part of minute
- hh:mm:Ppp, :mm:Ppp, :Ppp
Jewish or Hebrew time values traditionally divide the hour into 1080 parts, whereas there are commonly 3600 seconds per minute, that means one such part is 3⅓ seconds long hh:pppp. Since that is exactly the 18th part of a minute, sometimes the minute is divided into 18 parts instead hh:mm:pp. Because this is easily confused with minute-second notation it is not supported directly, without a marker at least.
Todo: Use first 18 letters of the Hebrew alphabet as digits in hh:mm:P?
The four-digit part notation is a waste of space, actually, because it runs from 0000 through 1079 and thus leaves 8920 possible combination unused, but there seems to be no other system that subdivides the hour in a similar way and it leaves open the possibility of dividing it into 100 to 1000 parts (i.e. 3.6 s – 36 s) in a hh:xxx format.
Time zone[]
level of detail | positive offset | negative offset | ||
---|---|---|---|---|
h | +hh | +2 | −hh | -2 |
not applicable | ||||
m/h | +hh:mm | +2:2 | −hh:mm | -2:2 |
+hhmm | +4 | −hhmm | -4 |
The negative zero time zone offset -00:00 or -00 is valid and, as in RFC 3339, it explicitly specifies that there is no preferred timezone.
Times without explicit offset are in a user-defined time zone. The marker U, in place of Z, automatically selects the time zone the emitter (server) is currently in, whereas the marker Y selects the offset applicable for the recipient (client). Note that a time is optional before an offset, but its marker is not, i.e. CCYY-MM-DDTZ is valid, but CCYY-MM-DDZ is not.
Instead of a single-letter or numeric offset, all alphabetic geographical codes from ISO 3166, which are at least two characters long, may be used as time zone markers. They should respect the date to automatically consider historic time zones and daylight saving time (DST). Note that time zones are not available before the late 19th century.
Intervals, spans, periods, repetitions[]
- under construction
- ‘Q’ is added for the 13|14-week quart, 3-month triads remain “3M”
- A duration may now combine weeks with years and days, but not with months. ISO 8601:2004 only allowed PnW, but not PmYnWoD. A year, in this case, consist of either 52 or 53 complete weeks.
- ‘F’ is added for the 30-day month (“30D”).
- ‘L’ is added for the lunar month (ca. 29.5 days). It should only be used with absolute start or end date.
- When a time interval is specified by start and end date, both should be provided in the same format.
Alternate syntax[]
- This subsection is optional.
Note: The parentheses / brackets / braces conventions are mostly incompatible with EDTF
- Complete dates, times and datetimes may be surrounded by paired parentheses ‘(’ and ‘)’.
- When start and end datetime in intervals are enclosed thusly the separating slash may be replaced by a double hyphen ‘--’ or en dash ‘–’.
- Instead of the prefix marker ‘P’ or in addition to it, durations may be enclosed in paired square brackets ‘[’ and ‘]’. The opening bracket is placed before the marker if both are used.
- When the bracket notation is used, alternate symbols may be used for the year ‘a’, the month ‘mon’ and the minute ‘min’ and whitespace is permissable after symbols.
- Instead of the prefix marker ‘R’ or in addition to it, repeated intervals may be enclosed in paired braces ‘{’ and ‘}’. The opening brace is placed after the marker, the optional number of repetitions and the slash, which also becomes optional then.
Wildcards, partial duration, uncertainty[]
- This subsection is optional.
Note: EDTF has a similar but much more elaborate model to specify uncertainty, esp. in Level 2
When intervals are specified with start and end date and no duration, fields may be left out from the end date and are assumed to be the same as for the start date, e.g. 2012-09-10/11 is a two-day span.
Alternatively, square brackets may be used around field values, which then can use a richer format: it contains a semicolon-separated list of spans where the end value and the slash are optional, e.g. 2012-09-[10;12/14]. The alternate double hyphen is also valid then, e.g. 2012-09-[10--12], it may be replaced by an em dash U+2014, e.g. 2012-09-[10—12]. Brackets may be used with any field, e.g. [2012/2015]-09-10.
Uncertain dates, e.g. in genealogy, may be specified with a tilde followed by the amount of uncertainty, e.g. 2012-09-[11~1] is the same as 2012-09-[10--12].
Another option to specify multiple or uncertain dates are wildcards. To mark a single digit as arbitrariy it is replaced by the marker ‘X’, to mark a complete field – no matter its length – as arbitrary it is replaced by the marker asterisk ‘*’, but markers such as ‘W’ remain. In data interchange, digits to be filled in by the partner may be replaced by the underscore ‘_’ instead of ‘X’.
Templates and comments[]
- under construction
Comments[]
Comments are placed between an opening angular bracket ‘<’ and a closing one ‘>’. A conforming software implementation may ignore anything after the comment start character and the matching comment end character or the end of the date string. This may be used, among other things, to tag a month-day date with its weekday, e.g. 2012-09-10<Monday>.
Templates[]
Todo: Better define how to use years, especially regarding leap rules and start.
- This section is optional.
Users may declare subdivisions of their own for the years defined above and they may specify dates in that custom calendar.
- CCYY – 365|366 days, leap day, default
- CCYYW = CCYYM = CCYYQ – 364|371 days, 52|53 weeks, leap week
- CCYYF – 360 days, 12 months, 30 days each
- CCYYL – 12 or 13 months, 29 or 30 days each
- CCYYS – 4 seasons, 12 signs
This is done by providing the length of the subdivision in angular brackets ‘<’ length ‘>’ after a slash ‘/’ and possibly the ordinal value before the slash. The smallest (and default) subdivision length before a ‘T’ marker is one day. If the subdivision length is the same for all items it is automatically repeated, otherwise alternating lengths can be separated by a colon to form a pattern, in the worst case a non-repeating pattern has to be used which lists all subdivision lengths. Separators, i.e. dashes, are not optional between closing and opening angular bracket. The leap item is indicated by an asterisk character ‘*’ followed by the number of items, which can be left out if equal to one ‘*1’. If there is an intercalary subdivision it is denoted by a plus sign ‘+’ and is either placed directly after the item it belongs to or after another slash. The hash character ‘#’ may be used in place of ordinal numbers when defining the calendar.
In date designations, the ordinal number and the length must both be left-padded with zeros to the same length which must be the smallest number of decimal digits capable of representing the largest subdivision.
Template examples[]
- Symmetry454 Calendar:
- Q-</4>-</3>-</4:5:4/*>-</7> – the asterisk automatically is seven days, i.e. a week long
- Q-</4>-</3>-</28:35:28/*7>
- W-</12>-</4:5:4/*>-</7> – since twelve items are needed, but the pattern only contains three, it is repeated four times
- W-</12>-</28:35:28/*7>
- Symmetry010 Calendar:
- W-</12>-</30:31:30/*7>
- Q-</4>-</3>-</30:31:30/*7> – Should this work or does it put a leap week at the end of every quarter?
- World Season Calendar:
- S-</4>-</91@7:91*@0:91@7:91+@0>
- wrong: S-</4>-</13:13*:13:13+>-</7@7> – This way the second and fourth seasons had leap or extra weeks not days.
- World Calendar:
- -</12>-</31:30:30/+*> – Simple form, but imprecise.
- -</12:1>-</31@7:30:30/+@0*@0> – More verbose form with the first month (and the week) made to start Sunday, intercalary days and leap days made special ‘@0’, which they are not by default.
- wrong:-</12+*>-</31:30:30> – That would place an intercalary month and leap month after the twelfth, and both would have 31 days.
- Pax Calendar:
- W-</14>-</4:4:4:4:4:4:4:4:4:4:4:*:4>-</7@7> – Note how the leap week called “Pax” gets a month of its own and how it makes the pattern more complicated. The week starts Sunday ‘@7’.
- W-</12:*:1>-</4/1/4>-</7@7> – Alternate, shorter form
- International Fixed Calendar:
- -</15>-</28@7:28:28:28:28:28:+:28@7:28:28:28:28:28:28:*> – Note how you cannot simply use 4 weeks, because of the leap day and the intercalary day which do not belong to any month. Weeks begin on Sunday, hence “/@7”, which also turns the two special days into virtual Sundays.
- -</6:+:7:*>-</4/1/4/1>-</7@7/1@0/7@7/1@0> – Alternate, shorter form with special days made special ‘0’.
- 30x11 Calendar:
- -</11:1>-</30/35*>
- New Earth Calendar:
- W-</13>-</4/*>-</7> – shortest, but slightly incorrect form
- W-</12:1>-</28/28*7>
- Gregorian Calendar:
- -</12>-</31:28*:31:30:31:30:31:31:30:31:30:31> – Note how the leap day belongs to February. Nothing is said about the week.
- -</2:5:5>-</31:28*/31:30/31:30> – unconvential, but shorter variant.
Once a convention has been established, the lengths of the subdivisions may be left out.
Holidays[]
With a calendar reform there are always several ways to determine the date of annual holidays and birthdays.
- Convert from the classic calendar each year, e.g. Christmas, December 25, stays at -12-25 and can fall on any day of the week.
- A special case are astronomically defined holidays which use features that are not accurately represented in the calendar, e.g. four days after the winter solstice (could be written -S0-1-04 or -S4-04 etc.). They have to be determined by observation or, rather, by independent calculation.
- Convert the original date to the new calendar, e.g. 0000-12-25 was a Monday, hence -W52-1.
- Use a similar looking date in the new calendar, e.g. -M12-25 which is a Thursday and equals -M12-W4-4.
- Reinterpret the date in the new calendar, e.g. three weeks and four days into the last month of the year, -12-W3-4 (Thursday), or one week before the last day of the year, -W51-7 (Sunday).
Depending on the reason for a holiday one or several of these methods may make sense to use. Note that stakeholders may prefer different approaches for external reasons, workers may prefer to have holidays not fall on weekends, for example.
Dom. | Frequency | *-01-01 | *-01-06 | *-02-14 | *-05-01 | *-11-01 | *-12-25 |
---|---|---|---|---|---|---|---|
C | 43 ⇒ 10¾% | W53-5 | W01-3 | W06-7 | W17-6 | W44-1 | W51-6 |
CB | 15 ⇒ 3¾% | W17-7 | W44-2 | W51-7 | |||
B* | 13 ⇒ 3¼% | W53-6 | W01-4 | W07-1 | |||
B | 30 ⇒ 7½% | W52-6 | |||||
BA | 13 ⇒ 3¼% | W18-1 | W44-3 | W52-1 | |||
A | 43 ⇒ 10¾% | W52-7 | W01-5 | W07-2 | |||
AG | 15 ⇒ 3¾% | W18-2 | W44-4 | W52-2 | |||
G | 43 ⇒ 10¾% | W01-1 | W01-6 | W07-3 | |||
GF | 13 ⇒ 3¼% | W18-3 | W44-5 | W52-3 | |||
F | 44 ⇒ 11% | W01-2 | W01-7 | W07-4 | |||
FE | 14 ⇒ 3½% | W18-4 | W44-6 | W52-4 | |||
E | 43 ⇒ 10¾% | W01-3 | W02-1 | W07-5 | |||
ED | 14 ⇒ 3½% | W18-5 | W44-7 | W52-5 | |||
D | 44 ⇒ 11% | W01-4 | W02-2 | W07-6 | |||
DC | 13 ⇒ 3¼% | W18-6 | W45-1 | W52-6 |
Dom. | Frequency | US | France | Germany |
---|---|---|---|---|
1776-07-04 | 1789-07-14 | 1990-10-03 | ||
C | 43 ⇒ 10¾% | W26-7 | W28-3 | W39-7 |
CB | 15 ⇒ 3¾% | W27-1 | W28-4 | W40-1 |
B* | 13 ⇒ 3¼% | |||
B | 30 ⇒ 7½% | |||
BA | 13 ⇒ 3¼% | W27-2 | W28-5 | W40-2 |
A | 43 ⇒ 10¾% | |||
AG | 15 ⇒ 3¾% | W27-3 | W28-6 | W40-3 |
G | 43 ⇒ 10¾% | |||
GF | 13 ⇒ 3¼% | W27-4 | W28-7 | W40-4 |
F | 44 ⇒ 11% | |||
FE | 14 ⇒ 3½% | W27-5 | W29-1 | W40-5 |
E | 43 ⇒ 10¾% | |||
ED | 14 ⇒ 3½% | W27-6 | W29-2 | W40-6 |
D | 44 ⇒ 11% | |||
DC | 13 ⇒ 3¼% | W27-7 | W29-3 | W40-7 |
Astronomically defined holidays can of course be fixed arbitrarily in any calendar. The date of Easter in non-orthodox churches, for instance, is currently specified as the first Sunday after the first full moon after the begin of spring in the Gregorian calendar (-03-21). One could instead use the corresponding week from the year Jesus of Nazareth supposedly died on the cross, or one selects the day that is most frequently selected by the current rule or is closest to the median, -W14-7.
Implementation[]
- under construction
A fully compliant software implementation of this specification must be able to accept any of the formats described and convert it into every other representation. A partially compliant implementation must accept at least one of the formats and must not successfully parse any otherwise valid format into something else.
Path syntax[]
- under construction
In file systems and web addresses (URL, URI, IRI), the fields in hierarchical data are often separated by the forward slash or solidus ‘/’. In ISO 8601:2004, this character is normally used to separate the parts of time intervals instead.
Paths in such addresses may use the slash as a separator instead of dash ‘-’ and colon ‘:’, if and only if compact forms and durations and time zones are not used. It may also replace the ‘T’ marker in datetimes. Implied fields and reduced precision are valid.
Query and Fragment syntax[]
In the query part of web addresses, i.e. after a question mark ‘?’, the normal forms should be used as values, i.e. right of an equals sign ‘=’. The uppercase markers ‘P’, ‘R’, ‘T’ and new ‘D’ for dates or combined datetimes are registered as universal keys, i.e. left of the equals sign ‘=’. They must not be repeated afterwards. All forms defined herein are valid, but may not be supported by legacy applications, e.g. /foo?D=2012-09-12.
In the local part of web addresses, i.e. after a hash sign ‘#’, the same key-value syntax is supported. Please note the existence of Media Fragments, though, especially the t=clock:<start>,<end> format, which only supports the RFC 3339 profile of ISO 8601, i.e. hardly more than CCYY-MM-DDThh:mm:ss±hh:mm.
Applications may support all forms without key and equals sign as the single value, e.g. /foo?2012-W30 or /foo#2012-09, but the markers, except for ‘D’ then become mandatory again. An exception to the ruleset above are time intervals that are specified by slash-separated start date as the path part before the question mark ‘?’ and the end date or duration, also with slashes, as query without name value distinction, e.g. /2012/09/01?/10/08 is the address notation for standard 2012-09-01/10-08.
Formal grammar[]
Note: Details on separate page
- under construction
;; @LICENSE Public Domain, no rights reserved
;; @COMPATIBLE superset of ISO 8601 and RFC 3339
;
; DATES
;
; era-sign ::= plus | minus
year ::= full-year | simple-year ; ±E*CCYY | CCYY | YY
full-year ::= short-year | long-year ; ±E*CCYY | CCYY
basic-year ::= short-year | simple-year ; CCYY | YY
simple-year ::= to-doublezero ; YY = 00..99
short-year ::= simple-century simple-year ; CCYY = 0000..9999
long-year ::= positive-year | negative-year ; ±E*CCYY
positive-year ::= plus long-century simple-year ; +E*CCYY
negative-year ::= minus long-century simple-year ; -E*CCYY
century ::= simple-century | long-century ; E*CC
simple-century ::= to-doublezero ; CC = 00..99
long-century ::= (1-6)*DIGIT simple-century ; C+ = ...
triad-of-year ::= to-four ; Q = 1..4
month-of-year ::= to-twelve ; MM = 01..12
month-of-triad ::= to-three ; M = 1..3
month-of-quart ::= to-three ; M = 1..3
day-of-year ::= to-threesixtysix ; DDD = 001..365/366 not 364/371
day-of-triad ::= to-ninetytwo ; DD = 01..90/91/92
day-of-month ::= to-thirtyone ; DD = 01..28/29/30/31
day-of-week ::= to-seven ; D = 1..7 not 0
day-of-quart ::= to-ninetyeight ; DD = 01..91/98
day-of-moon ::= to-thirtyfive ; DD = 01..28/35
day-of-lunation ::= to-thirty ; DD = 01..29/30
weekday ::= to-seven ; D = 0..7 ; null-days not handled yet
weekday-of-triad ::= to-fourteen ; WW = 00/01..12/13/14
weekday-of-month ::= to-five ; W = 0/1..4/5
weekday-of-lunation ::= to-five ; W = 0/1..4/5
week-of-year ::= to-fiftythree ; WW = 01..52/53
week-of-triad ::= to-fourteen ; WW = 01..12/13/14
week-of-quart ::= to-fourteen ; WW = 01..13/14
week-of-month ::= to-five ; W = 1..4/5
week-of-moon ::= to-five ; W = 1..4/5
quart-of-year ::= to-four ; Q = 1..4
moon-of-year ::= to-thirteen ; MM = 01..13
lunation-of-year ::= to-thirteen ; MM = 01..13
part-of-date ::= part-of ;
season-of-year ::= to-four ; Q = 1..4
sign-of-season ::= to-three ; M = 1..3
quarter-of-f-year ::= to-four ; 'F'Q = 0/1..4
month-of-f-year ::= to-twelve ; 'F'MM = 00/01..12
day-of-f-year ::= to-threesixty ; 'F'DDD = 001..360
day-of-f-month ::= to-thirty ; 'F'DD = 00/01..30
;
; TIMES
;
hour ::= to-twentyfour ; hh = 00..23/24
minute ::= to-fiftynine ; mm = 00..59
second ::= to-sixty ; ss = 00..58/59/60
part-of-time ::= part-of ;
;
; GENERAL
;
part-of ::= decimal-separator digit [digit]* ; ('.'|',')f+
digit ::= zero | to-nine
single-digit ::= digit
double-digit ::= single-digit single-digit
triple-digit ::= double-digit single-digit
zero-thru-two ::= zero one-thru-two
zero-thru-three ::= zero one-thru-three
zero-thru-four ::= zero one-thru-four
zero-thru-five ::= zero one-thru-five
zero-thru-seven ::= zero one-thru-seven
zero-thru-nine ::= zero one-thru-nine
zero-thru-ninetynine::= zero one-thru-ninetynine
one-thru-two ::= one | two
one-thru-three ::= one-thru-two | three
one-thru-four ::= one-thru-three | four
one-thru-five ::= one-thru-four | five
one-thru-seven ::= one-thru-five | six | seven
one-thru-nine ::= one-thru-seven | eight | nine
one-thru-ninetynine ::= [zero one-thru-nine] | [one-thru-nine zero-thru-nine]
; fields "to-*":
; single-digit
to-two ::= one | two | field-wildcard
to-three ::= to-two | three
to-four ::= to-three | four
to-five ::= to-four | five
to-seven ::= to-five | six | seven
to-nine ::= to-seven | eight | nine
; double-digit
to-nine-pad ::= zero one-thru-nine | field-wildcard
to-twelve ::= to-nine-pad | [one zero-thru-two]
to-thirteen ::= to-twelve | [one three]
to-fourteen ::= to-thirteen | [one four]
to-twentyfour ::= to-nine-pad | [one zero-thru-nine] | [two [zero-thru-four]]
to-twentyeight ::= to-twentyfour | [two [five | six | seven | eight]]
to-twentynine ::= to-twentyeight | [two nine]
to-thirty ::= to-twentynine | [three zero]
to-thirtyone ::= to-thirty | [three one]
to-thirtyfive ::= to-thirtyone | [three [two | three | four | five]]
to-fiftytwo ::= to-nine-pad | [one-thru-four zero-thru-nine] | [five zero-thru-two]
to-fiftythree ::= to-fiftytwo | [five three]
to-fiftyeight ::= to-fiftythree | [five [four | five | six | seven | eight]]
to-fiftynine ::= to-fiftyeight | [five nine]
to-sixty ::= to-fifty-nine | [six zero]
to-ninety ::= to-fifty-nine | [[six | seven | eight] digit] | [nine zero]
to-ninetyone ::= to-ninety | [nine one]
to-ninetytwo ::= to-ninetyone | [nine two]
to-ninetyeight ::= to-ninetytwo | [nine [three | four | five | six | seven | eight]]
to-ninetynine ::= to-ninetyeight | [nine nine]
to-doublezero ::= to-ninetynine | [zero zero]
; triple-digit
to-ninetynine-pad ::= zero one-thru-ninetynine | field-wildcard
to-threesixty ::= to-ninetynine-pad | [one-thru-two zero-thru-ninetynine]
| [three [[zero-thru-five zero-thru-nine] | [six zero]]]
to-threesixtyfour ::= to-threesixty | [three six [one | two | three | four]]
to-threesixtyfive ::= to-threesixtyfour | [three six five]
to-threesixtysix ::= to-threesixtyfive | [three six six]
to-threeseventyone ::= to-threesixty | [three [[six one-to-nine] | [seven [zero | one]]]]
;
; Separators
;
separator ::= datetime-separator | decimal-separator | span-separator
datetime-separator ::= time-separator | space
null-separator ::= empty | comment
date-separator ::= [comment]* dash [comment]*
time-separator ::= [comment]* colon [comment]*
decimal-separator ::= [comment]* [comma | dot] [comment]*
span-separator ::= [comment]* slash [comment]*
interval-separator ::= span-separator | hyphen
uncertain-separator ::= tilde | plusminus
;
; Wildcards
;
wildcard ::= digit-wildcard | field-wildcard
digit-wildcard ::= provide-wildcard | unknown-wildcard
provide-wildcard ::= underscore
unknown-wildcard ::= X
field-wildcard ::= asterisk
template-wildcard ::= hash
;
; Alternate path syntax
; optional, restricted
; only if compact forms and durations and time zones are not used
; processed after percent-decoding
date-key ::= date-marker ; uppercase keys only?
time-key ::= time-marker
duration-key ::= duration-marker
repetition-key ::= repetition-marker
pair ::= any-par | dating-pair
any-pair ::= key pair-separator value
key ::= ; defined elsewhere
value ::= date | time | datetime | duration | repetition
dating-pair ::= datetime-pair | [date-pair || time-pair] | duration-pair | repetition-pair
datetime-pair ::= date-key pair-separator datetime
date-pair ::= date-key pair-separator date
time-pair ::= time-key pair-separator time
duration-pair ::= duration-key pair-separator duration
repetition-pair ::= repetition-key pair-separator repetition
query ::= query-marker [pair | value]
; normal key-value combinations should still be possible, but this is not specified here
; not implemented: time intervals specified by slash-separated start date as path and end date or duration with slashes as query without name value distinction, e.g. /2012/09/01?/10/08 = 2012-09-01/10-08
path-separator ::=
path-date-separator ::= slash
path-time-separator ::= slash
path-span-separator ::= question
path-query-marker ::= hash | question
path-query-separator::= semicolon | ampersand
path-pair-separator ::= equals
path-date-marker ::= slash | date-marker
path-time-marker ::= slash | time-marker
;
; Markers
;
; prefix
; suffix
marker ::= day-marker | month-marker
| week-marker | moon-marker | quarter-marker
| lunar-marker | season-marker | fiscal-marker
| date-marker | time-marker | duration-marker | repetition-marker
quarter-marker ::= triad-marker | quart-marker
triad-marker ::= empty
quart-marker ::= Q
season-marker ::= S
month-marker ::= empty
moon-marker ::= M
lunar-marker ::= L
week-marker ::= W
day-marker ::= empty
fiscal-marker ::= F
date-marker ::= D
time-marker ::= T
duration-marker ::= P
repetition-marker ::= R
UTC-marker ::= Z
definition-marker ::= at
leap-item-marker ::= asterisk
intercalary-marker ::= plus
;
; Pairs
;
comment-start ::= open-angle
comment-end ::= close-angle
date-start ::= open-paren
date-end ::= close-paren
duration-start ::= open-bracket
duration-end ::= close-bracket
repetition-start ::= open-brace
repetition-end ::= close-brace
;
; Unit symbols
;
;unit
year-unit ::= Y
quarter-unit ::= Q
triad-unit ::= quarter-unit ; 3M
quart-unit ::= quarter-unit ; 13W
season-unit ::= quarter-unit ; 3M
month-unit ::= M
moon-unit ::= month-unit ; 4W or 28D
fiscal-unit ::= month-unit | F ; 30D
lunation-unit ::= month-unit | L ; 29/30D
week-unit ::= W ; 7D
day-unit ::= D
hour-unit ::= H
minute-unit ::= M
second-unit ::= S
;
; FORMATS
;
; -std suffix for human-readable standard (or extended) format with hyphens or colons
; -basic suffix for compact formats without hyphens or colons
;
; Existing formats
;
;century ::= century ; see above
;year ::= year ; see above
year-day ::= year-day-std | year-day-basic
year-day-std ::= [year]? date-separator day-of-year
year-day-basic ::= [year]? null-separator day-of-year
year-month ::= year-month-std | year-month-basic
year-month-std ::= [year]? date-separator month-of-year
year-month-basic ::= null-separator
year-month-implied ::= null-separator
year-month-day ::= year-month-day-std | basic-day-month-year
year-month-day-std ::= [year-month-std | year-month-implied] date-separator day-of-month
year-month-day-basic ::= year-basic null-separator month-of-year null-separator day-of-month
year-week ::= year-week-std | year-week-basic
std-week-year ::= [year]? date-separator week-marker week-of-year
basic-week-year ::= [year]? null-separator week-marker week-of-year ; allows YY'W'WW
implied-year-week ::= date-separator ; 'W'?
year-week-day ::= year-week-day-std | year-week-day-basic
year-week-day-std ::= [year-week-std | implied-year-week] date-separator day-of-week
year-week-day-basic ::= [year-week-basic]? null-separator day-of-week ; allows YY'W'WWD and D
;
; New month-based formats
;
year-triad ::= [full-year]? date-separator triad-of-year
year-triad-month ::= year-triad date-separator month-of-triad ; forbids --M
year-triad-month-day ::= [year-triad-month | date-separator date-separator month-of-triad] date-separator day-of-month ; allows --M-DD
year-triad-weekday ::= year-triad date-separator weekday-of-triad date-separator weekday
year-month-weekday ::= [year-month-std | date-separator] weekday-of-month date-separator weekday
; year-triad-month-weekday; possible, but not specified
;
; New week-based formats
;
weekyear ::= full-year [week-marker | quart-marker | moon-marker]
; Quarts
year-quart ::= year-quart-std | basic-quart-year
year-quart-std ::= [full-year]? date-separator quart-marker quart-of-year
year-quart-basic ::= [full-year]? null-separator quart-marker quart-of-year
year-quart-implied ::= date-separator quart-marker
year-quart-day ::= year-quart-day-std | year-quart-day-basic
year-quart-day-std ::= [year-quart-std | year-quart-implied] date-separator day-of-quart ; allows '-Q-'DD
year-quart-day-basic ::= year-quart-basic null-separator day-of-quart
year-quart-week ::= year-quart-week-std | year-quart-week-basic
year-quart-week-std ::= [year-quart-std | year-quart-implied] date-separator week-marker week-of-quart
year-quart-week-basic ::= [year-quart-basic | quart-marker] null-separator week-marker week-of-quart
year-quart-week-day ::= year-quart-week-day-std | year-quart-week-day-basic
year-quart-week-day-std ::= year-quart-week-std date-separator day-of-week
year-quart-week-day-basic ::= year-quart-week-basic null-separator day-of-week
; Dual months
year-quart-month ::= year-quart-month-std | year-quart-month-basic
year-quart-month-std ::= year-quart-std date-separator month-of-quart
year-quart-month-basic::= year-quart-basic null-separator month-of-quart
year-quart-month-day ::= year-quart-month-day-std | year-quart-month-day-basic
year-quart-month-day-std ::= year-quart-month-std date-separator day-of-month ; 01..30/31
year-quart-month-day-basic::= year-quart-month-basic null-separator day-of-month; 01..30/31
year-quart-month-week ::= year-quart-month-week-std | year-quart-month-week-basic
year-quart-month-week-std ::= year-quart-month-std date-separator week-of-month ; 4..5
year-quart-month-week-basic::= year-quart-month-basic null-separator week-of-month ; 4..5
year-quart-month-week-day ::= year-quart-month-week-day-std | year-quart-month-week-day-basic
year-quart-month-week-day-std ::= year-quart-month-week-std date-separator day-of-week
year-quart-month-week-day-basic ::= year-quart-month-week-basic null-separator day-of-week
; Moons
year-moon ::= year-moon-std | year-moon-basic
year-moon-std ::= [full-year]? date-separator moon-marker moon-of-year
year-moon-basic ::= [full-year]? null-separator moon-marker moon-of-year
year-moon-implied ::= date-separator moon-marker
year-moon-day ::= year-moon-day-std | year-moon-day-basic
year-moon-day-std ::= [year-moon-std | year-moon-implied]? date-separator day-of-moon
year-moon-day-basic ::= [year-moon-basic]? null-separator day-of-moon
year-moon-week ::= year-moon-week-std | year-moon-week-basic
year-moon-week-std ::= [year-moon-std | year-moon-implied]? date-separator week-marker week-of-moon
year-moon-week-basic ::= [year-moon-basic | moon-marker]? null-separator week-marker week-of-moon
year-moon-week-day ::= year-moon-week-day-std | year-moon-week-day-basic
year-moon-week-day-std ::= year-moon-week-std date-separator day-of-week
year-moon-week-day-basic ::= year-moon-week-basic null-separator day-of-week
;
; New month-week-based formats
;
year-triad-week ::= year-triad date-separator week-marker week-of-triad
year-triad-week-day ::= year-triad-week date-separator day-of-week
year-month-week ::= [year-month | year-month-implied] date-separator week-marker week-of-month
year-month-week-day ::= year-month-week date-separator day-of-week
;
; New financial formats
; optional
;
fiscalyear ::= full-year fiscal-marker
; should the marker be part of the quarter, month and day fields instead of the year field?
year-fiscal-std ::= [full-year]? date-separator fiscal-marker
year-fiscal-basic ::= [full-year]? null-separator fiscal-marker
year-quarter-fiscal ::= year-quarter-fiscal-std | year-quarter-fiscal-basic
year-quarter-fiscal-std ::= year-fiscal-std date-separator quarter-of-f-year
year-quarter-fiscal-basic ::= year-fiscal-basic null-separator quarter-of-f-year
year-month-fiscal ::= year-month-fiscal-std | year-month-fiscal-basic
year-month-fiscal-std ::= year-fiscal-std date-separator month-of-f-year
year-month-fiscal-basic ::= year-fiscal-basic null-separator month-of-f-year
year-day-fiscal ::= year-day-fiscal-std | year-day-fiscal-basic ; deprecate?
year-day-fiscal-std ::= year-fiscal-std date-separator day-of-f-year ; deprecate?
year-day-fiscal-basic ::= year-fiscal-basic null-separator day-of-f-year ; deprecate?
year-month-fiscal-day ::= year-month-fiscal-day-std | year-month-fiscal-day-basic
year-month-fiscal-day-std ::= year-month-fiscal-std date-separator day-of-f-month
year-month-fiscal-day-basic::= year-month-fiscal-basic null-separator day-of-f-month
;
; New astronomic and astrologic formats
; optional
;
; Lunar
;
lunaryear ::= full-year lunar-marker
; should the marker be part of the lunation field instead of the year field?
year-lunar-std ::= [full-year]? date-separator lunar-marker
year-lunar-basic ::= [full-year]? null-separator lunar-marker
year-lunation ::= year-lunation-std | year-lunation-basic
year-lunation-std ::= year-lunar-std lunation-of-year
year-lunation-basic ::= year-lunar-basic lunation-of-year
year-lunation-day ::= year-lunation-day-std | year-lunation-day-basic
year-lunation-day-std ::= year-lunation-std date-separator day-of-lunation
year-lunation-day-basic ::= year-lunation-basic null-separator day-of-lunation
year-lunation-weekday ::= year-lunation-std date-separator weekday-of-lunation date-separator weekday
; compact format of year-lunation-weekday is invalid
;
; Season and zodiac sign
;
seasonyear ::= full-year season-marker ; astroyear
; should the marker be part of the season field instead of the year field?
year-season ::= year-season-std | year-season-basic
year-season-std ::= [full-year]? date-separator season-marker season-of-year
year-season-basic ::= [full-year]? null-separator season-marker season-of-year
year-season-implied ::= date-separator season-marker
year-season-sign ::= year-season-sign-std | year-season-sign-basic
year-season-sign-std ::= [year-season-std | year-season-implied] date-separator sign-of-season
year-season-sign-basic ::= year-season-basic null-separator sign-of-season
;
; Date in general
;
datetime ::= [date [datetime-separator time]] | [[date-marker]? fraction-date]
date ::= [date-marker]? integer-date
integer-date ::= year-number | quarter | month | week | day
fraction-date ::= date part-of-date ; includes part of day, i.e. time without 'T'
; date fields
; ordered by precision, no matter whether some part may be implied
year-number ::= year | weekyear | fiscalyear | lunaryear | seasonyear ; year = monthyear
quarter ::= triad | quart | fiscal-quarter | season
triad ::= triad-year ; triad-in-year
quart ::= quart-year ; quart-in-year
fiscal-quarter ::= fiscal-quarter-year
season ::= season-year ; season-in-year
month ::= common-month | dual-month | moon | fiscal-month | lunation | sign
common-month ::= month-in-year | month-in-triad
month-in-year ::= month-year
month-in-triad ::= month-triad-year
sign ::= sign-season-year ; sign-in-season, sign-in-year is not defined
dual-month ::= month-quart-year ; month-in-quart
moon ::= moon-year ; moon-in-year
fiscal-month ::= fiscal-month-year ;
lunation ::= lunation-year ; lunation-in-year
week ::= week-in-year | week-in-quarter | week-in-month
week-in-year ::= week-year
week-in-quarter ::= week-quart-year | week-triad-year
week-in-month ::= week-month-quart-year | week-month-year | week-moon-year
day ::= day-in-year | day-in-quarter | day-in-month | day-in-week | weekday
day-in-year ::= day-year | fiscal-day-year
day-in-quarter ::= day-quart-year
day-in-month ::= day-month-quart-year | day-month-triad-year
| day-month-year | day-moon-year | day-lunation-year | fiscal-day-month-year
day-in-week ::= day-week-year | day-week-quart-year | day-week-triad-year
| day-week-month-quart-year | day-week-month-year | day-week-moon-year
weekday ::= weekday-in-quarter | weekday-in-month
weekday-in-quarter ::= weekday-triad-year
weekday-in-month ::= weekday-lunation-year | weekday-month-year
;
; Time
;
time ::= hour-time | minute-time | second-time ; time-marker is not mandatory
fraction-time ::= [hour | hour-minute | hour-minute-second] part-of-time
hour-time ::= hour [part-of-time]?
minute-time ::= hour-minute [part-of-time]?
second-time ::= hour-minute-second [part-of-time]?
;hour-implied ::= time-separator
hour-minute ::= hour-minute-std | hour-minute-basic
std-hour-minute ::= hour time-separator minute
basic-hour-minute ::= hour null-separator minute
;hour-minute-implied ::= implied-hour time-separator
hour-minute-second ::= hour-minute-second-std | hour-minute-second-basic
hour-minute-second-std ::= hour-minute-std time-separator second
hour-minute-second-basic ::= hour-minute-basic null-separator second
timezone ::= UTC-marker | offset
offset ::= [plus | minus] [hour | hour-minute]
;
;
; TO DO
;
; Allow decimal time of day without ‘T’ prefix: “.5” and “,5” mean 12:00:00.
; Allow decimal part with comma after century, year, week year, quart, triad, month, moon, week and, of course, day.
; Furthermore, allow spreadsheet-compatible date-times with day-count from 1900-01-01 epoch and dot divider:
;
; Intervals, spans, periods, repetitions
;
; ‘Q’ is added for the 13|14-week quart, 3-month triads remain “3M”
; ‘F’ is added for the 30-day month (“30D”).
; ‘L’ is added for the lunar month (ca. 29.5 days). It should only be used with absolute start or end date.
;
repetition ::= repetition-marker [number]? span-separator interval
interval ::= datetime span-separator datetime
| datetime span-separator duration
| duration span-separator datetime
| duration
= datetime span-separator [ datetime | duration ]
| duration [ span-separator datetime ]?
duration ::= duration-marker [ datetime | datetime-duration ]
datetime-duration ::= date-duration [time-marker time-duration]?
date-duration ::= [number year-unit]? [number [month-unit | week-unit]]? [number day-unit]?
time-duration ::= [number hour-unit]? [number minute-unit]? [number second-unit]?
number ::= [1-9] *DIGIT [part-of]? ; are fractional parts allowed or just for one field?
;
; Alternate syntax
; optional
;
alt-datetime ::= datetime | pair-datetime ; [date-start datetime date-end]
pair-datetime ::= date-start [integer-date [date-end date-start time]? | fraction-date] date-end]
;
alt-duration ::= duration | pair-duration
pair-duration ::= duration-start [ alt-datetime | datetime-duration ] duration-end
;
alt-interval ::= interval | pair-interval
pair-interval ::= interval-start alt-datetime interval-separator [ alt-datetime | alt-duration ]
| alt-duration [ interval-separator alt-datetime ]? interval-end
;
alt-repetition ::= repetition | pair-repetition
pair-repetition::= [number]? repetition-start alt-interval repetition-end
; these do not yet handle the case where the markers are used in combination with parentheses or brackets
;
; other rules not fully implemented yet:
;
; When intervals are specified with start and end date and no duration,
; fields may be left out from the end date and are assumed to be the same as for the start date,
; e.g. 2012-09-10/11 is a two-day span.
; When start and end datetime in intervals are enclosed by '(' and ')',
; the separating slash may be replaced by a double hyphen ‘--’ or en dash ‘–’.
; The opening bracket is placed ''before'' the P marker if both are used.
; When the bracket notation is used, alternate symbols may be used for
; the year ‘a’, the month ‘mon’ and the minute ‘min’ and whitespace is permissable after symbols.
; The opening brace is placed ''after'' the R marker, the optional number of repetitions and then optional slash
;
; partial duration, uncertainty
; optional
;
field-start ::= open-bracket
field-end ::= close-bracket
field ::= field-start field-list field-end
field-list ::= field-value [semicolon field-value]*
field-value ::= field-span | field-uncertain | field-item
field-span ::= field-item interval-separator field-item
field-uncertain ::= field-item uncertain-separator field-item ; amount of uncertainty must be padded to the same length as usual field values, but may be zero, which is not yet handled, there is no way yet to specify deviation in one direction only (i.e. before/minus and after/plus)
field-item ::= ;...
;
; Template
; optional
;
template-start ::= comment-start
template-end ::= comment-end
template-separator ::= slash
pattern-separator ::= colon
template-field ::= template-start template-ordinal [template-separator template-pattern]* template-end
template-ordinal ::= field-value | template-wildcard ; but no nested comment
template-pattern ::= template-length [pattern-separator template-length]*
template-length ::= [field-item || [leap-item-marker [number]?] || [intercalary-marker [number]?]]
;
; TERMINAL SYMBOLS
;
zero ::= '0' | digit-wildcard
one ::= '1' | digit-wildcard
two ::= '2' | digit-wildcard
three ::= '3' | digit-wildcard
four ::= '4' | digit-wildcard
five ::= '5' | digit-wildcard
six ::= '6' | digit-wildcard
seven ::= '7' | digit-wildcard
eight ::= '8' | digit-wildcard
nine ::= '9' | digit-wildcard
plus ::= '+'
minus ::= '-' | '–' | '−' ; hyphen-minus, en-dash, minus sign
hyphen ::= '--' | '–' | '‐' | '‑' | ''; double hyphen, en-dash, hyphens
dash ::= '-' | '–' ; hyphen-minus, en-dash
plusminus ::= '±';
slash ::= '/' ; solidus
comma ::= ','
dot ::= '.' ; period, full stop
colon ::= ':'
semicolon ::= ';'
tilde ::= '~'
underscore ::= '_' ; low line
asterisk ::= '*' ; star
at ::= '@'
hash ::= '#'
question ::= '?'
ampersand ::= '&'
equals ::= '='
empty ::= ''
space ::= ' ' | \t | \n | \r | \f ; several types of whitespace
; Pairs
open-angle ::= '<' | '‹' ; angular bracket, guillemet
close-angle ::= '>' | '›'
open-paren ::= '(' ; round bracket, parentheses
close-paren ::= ')'
open-bracket ::= '[' ; square bracket
close-bracket ::= ']'
open-brace ::= '{' ; curly bracket
close-brace ::= '}'
; Letters, ASCII-case insensitive
A ::= 'A' | 'a'
B ::= 'B' | 'b'
C ::= 'C' | 'c'
D ::= 'D' | 'd'
E ::= 'E' | 'e'
F ::= 'F' | 'f'
G ::= 'G' | 'g'
H ::= 'H' | 'h'
I ::= 'I' | 'i' ; should not be used, because of confusion with one ‘1’
J ::= 'J' | 'j'
K ::= 'K' | 'k'
L ::= 'L' | 'l'
M ::= 'M' | 'm'
N ::= 'N' | 'n'
O ::= 'O' | 'o' ; should not be used, because of confusion with zero ‘0’
P ::= 'P' | 'p'
Q ::= 'Q' | 'q'
R ::= 'R' | 'r'
S ::= 'S' | 's'
T ::= 'T' | 't'
U ::= 'U' | 'u'
V ::= 'V' | 'v'
W ::= 'W' | 'w'
X ::= 'X' | 'x'
Y ::= 'Y' | 'y'
Z ::= 'Z' | 'z'
== Resources ==