Calendar Wiki
Flag of the International Calendar

Flag of the International Calendars, showing 7×4 segments

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.


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.


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).


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[]

Existing formats with digits code
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-205
 CCYYDDD 7 2024205
m/y ±CCYY-MM ±4-2 2024-07
d/m/y ±CCYY-MM-DD ±4-2-2 2024-07-24
 CCYYMMDD 8 20240724
w/y ±CCYY-WWW ±4-W2 2024-W30
±CCYYWWW ±4W2 2024W30
d/w/y ±CCYY-WWW-D ±4-W2-1 2024-W30-3
±CCYYWWWD ±4W3 2024W303

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

Proposed year formats with digits code
level of detail full date sample
y ECCYY +ECCYY ±5 +02024
EECCYY +EECCYY ±6 +002024
EEECCYY +EEECCYY ±7 +0002024

±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.


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.


Proposed truncated formats for existing formats with digits code
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-206 -206
YYDDD 5 DDD 3 24 206
m/y YY-MM 2-2 -MM -2 24-07 -07
invalid invalid
d/m/y YY-MM-DD 2-2-2 -MM-DD -2-2 --DD --2 24-07-24 -07-24 --24
YYMMDD 6 invalid invalid 240724
w/y YY-WWW 2-W2 -WWW -W2 24-W30 -W30
YYWWW 2W2 WWW W2 24W30 W30
d/w/y YY-WWW-D 2-W2-1 -WWW-D -W2-1 --D --1 24-W30-3 -W30-3 --3
YYWWWD 2W3 WWWD W3 D 1 24W3 W303 3

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.

Deprecated truncated formats with digits code and alternatives
Format Sample Hyphens Implied field(s) Alternative Wildcards
-YY -2 -24 1 century none XXYY, +XXXYY, –XXXYY, …
--MM --2 --07 2 year -MM XXXXMM, *MM, *-MM, …
---DD ---2 ---24 3 month --DD **DD, *-*-DD, -XX-DD, XXXX-XX-DD, …
-DDD -3 -206 1* year same, DDD *-DDD, *DDD, XXXXDDD, …
-WWW -W2 -W30 1 year same, WWW *-WWW, *WWW, XXXX-WWW, …
-W-D -W-1 -W-3 2×1 week same -WXX-D, *W*D, …
---D ---1 ---3 3 any week --D, D **D, *-*-D, …
-Y-WWW -1-W2 -4-W30 2×1 decade none XXXY-WWW, …
-YWWW -1W2 -4W30 1 decade none XXXYWWW, …
-mm -2 T-28 1 hour :mm T*mm, *:mm, T*:mm, XX:mm, TXX:mm
--ss --2 T--33 2 minute ::ss T**ss, *:*:ss, :*:ss, …
Days of the week (dow, D)
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 ☾ / ☽︎ ☉︎ / 🜚︎


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.

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.

Solar leap cycles with an integer number of 7-day weeks
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).

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
A alternative, academic; ancient; Armenian ? ? ? ?
B biblical, Babylonian; Baháʼí; Buddhist ? ? ? like default
week starts Sunday
C civil; Christian, church; Chinese; Celtic; Coptic ? ? ? ?
D default, date, day 2001-01-01 ? ? ?
E Egyptian; Enoch; Ethiopian ? ? ? ?
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.
H historic; Hijri; Hindu; Hebrew? ? none, 365-day year
years begin -03-01 at any day of the week, the standard week cycle is used
I international 2001-01-01 293 1/71 d, 1/52 w, 1/13 m, 1/4 q ?
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
L lunar, lunation ? ? ? ?
M moon, month, Meton, monetary, Muslim ? ? ? ?
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
O ≠ 0 old ? ? ? ?
Q quarter; Qumran? ? ? ? ?
S season, solar, sun, solstice ? ? ? ?
W01 contains / starts after Northern winter solstice
U user custom custom custom custom
V Vedic ? ? ? ?
W week ? ? ? ?
Y year ? ? ? ?
Z zodiac; Zoroastrian ? ? ? ?
W01 contains / starts after Northern spring equinox ?

Month-based additions and clarifications[]

Proposed month-based formats with digits code
3-month triad
level of detail full date year implied more implied (full) sample
q/y ±CCYY-Q ±4-1 -Q -1 2024‑3
m/q/y ±CCYY-Q-M ±4-1-1 -Q-M -1-1 2024‑3‑1
d/m/q/y ±CCYY-Q-M-DD ±4-1-1-2 -Q-M-DD -1-1-2 --M-DD --1-2 2024‑3‑1‑24
d/q/y ±CCYY-Q-DD ±4-1-2 -Q-DD -1-2 2024‑3‑24
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‑3‑04‑3
dw/m/y ±CCYY-MM-W-D ±4-2-1-1 -MM-W-D -2-1-1 --W-D --1-1 2024-07‑4‑3

The month year has 365 days in a common year or 366 days in a leap year.

Triad: 3-month quarters[]

Numeric date format
Month of triad
Day of month of triad
Day of triad

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 year layout
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
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[]

Proposed week-based formats with digits code
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 -QQ -Q1 2024-Q3
±CCYYQQ ±4Q1 QQ Q1 2024Q3
d/qw/y ±CCYY-QQ-DD ±4-Q1-2 -QQ-DD -Q1-2 -Q-DD -Q-2 2024-Q3-24
±CCYYQQDD ±4Q3 QQDD Q3 invalid 2024Q324
w/qw/y ±CCYY-QQ-WWW ±4-Q1-W2 -QQ-WWW -Q1-W2 -Q-WWW -Q-W2 2024-Q3-W04
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-Q3-W04-3
m/qw/y ±CCYY-QQ-M ±4-Q1-1 -QQ-M -Q1-1 2024-Q3-1
±CCYYQQM ±4Q2 QQM Q2 2024Q31
d/m/qw/y ±CCYY-QQ-M-DD ±4-Q1-1-2 -QQ-M-DD -Q1-1-2 2024-Q3-1-24
±CCYYQQMDD ±4Q4 QQMDD Q4 2024Q3124
w/m/q/y ±CCYY-QQ-M-WW ±4-Q1-1-W1 -QQ-M-WW -Q1-1-W1 2024-Q3-1-W4
d/w/m/q/y ±CCYY-QQ-M-WW-D ±4-Q1-1-W1-1 -QQ-M-WW-D -Q1-1-W1-1 2024-Q3-1-W4-3
4-week moons
m13/y ±CCYY-MMM ±4-M2 -MMM -M2 2024-M08
±CCYYMMM ±4M2 MMM M2 2024M08
d/m13/y ±CCYY-MMM-DD ±4-M2-2 -MMM-DD -M2-2 -M-DD -M-2 2024-M08-10
±CCYYMMMDD ±4M4 MMMDD M4 invalid 2024M0810
w/m13/y ±CCYY-MMM-WW ±4-M2-W1 -MMM-WW -M2-W1 -M-WW -M-W1 2024-M08-W2
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-M08-W2-3

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.

Week year layout
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

Quart: 13-week quarters[]

Quart layout for day or week of quart
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
Quart layout for day or week of month of quart
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
Quart of year
Day of quart
Week of quart
Day of Week
Month of quart
Day of month
Week of month
Day of month

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[]

Moon layout
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
Moon of year
Day of moon
Week of moon
Day of week

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.

Northern-hemisphere, North-American[1] and Celtic moon names
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[]

Proposed mixed formats with digits code
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-3-W04
d/w/q/y ±CCYY-Q-WWW-D ±4-1-W2-1 -Q-WWW-D -1-W2-1 2024-3-W04-3
w/m/y ±CCYY-MM-WW ±4-2-W1 -MM-WW -2-W1 --WW --W1 2024-07-W2
d/w/m/y ±CCYY-MM-WW-D ±4-2-W1-1 -MM-WW-D -2-W1-1 --WW-D --W1-1 2024-07-W2-3

Week of month or of triad[]

Weeks per month, year and triad depending on the weekday of -01-01; in leap years marked adjacent months switch their week count (“4+ 5–”)
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
Day of week
Week of month
day of week

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.
Formats for weeks of different length
level of detail full date year implied
d/w/y ±CCYY-PWW-D ±4-P2-1 -PWW-D -P2-1
w/y ±CCYY-PWW ±4-P2 -PWW -P2
d/w/y ±CCYY-HWW-D ±4-H2-1 -HWW-D -H2-1
w/y ±CCYY-HWW ±4-H2 -HWW -H2
d/w/y ±CCYY-OWW-D ±4-O2-1 -OWW-D -O2-1
w/y ±CCYY-OWW ±4-O2 -OWW -O2
d/w/y ±CCYY-NWW-D ±4-N2-1 -NWW-D -N2-1
w/y ±CCYY-NWW ±4-N2 -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[]

Financial and administrative additions with digits code
level of detail full date year implied
y30 ±CCYYF ±4F
q/y ±CCYY-FQ ±4-F1 -FQ -F1
m/y ±CCYY-FMM ±4-F2 -FMM -F2
d/y ±CCYY-FDDD ±4-F3 -FDDD -F3
d/m/y ±CCYY-FMM-DD ±4-F2-2 -FMM-DD -F2-2
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.

Equivalence of null and extra dates
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

Academic terms with digits code
level of detail full date year implied
h/y ±CCYY-HH ±4-H1 -HH -H1
q/h/y ±CCYY-HH-QQ ±4-H1-Q1 -HH-QQ -H1-Q1
m/h/y ±CCYY-HH-M ±4-H1-1 -HH-M -H1-1
w/h/y ±CCYY-HH-WWW ±4-H1-W2 -HH-WWW H1-W2
w/q/h/y ±CCYY-HH-QQ-WWW ±4-H1-Q1-W2 -HH-QQ-WWW H1-Q1-W2
d/m/h/y ±CCYY-HH-M-DD ±4-H1-1-2 -HH-M-DD -H1-1-2
d/w/h/y ±CCYY-HH-WWW-D ±4-H1-W2-1 -HH-WWW-D H1-W2-1
d/w/q/h/y ±CCYY-HH-QQ-WWW-D ±4-H1-Q1-W2-1 -HH-QQ-WWW-D H1-Q1-W2-1
Academic terms
level of detail full date year implied
t/y ±CCYY-AT ±4-A1 -AT -A1
m/t/y ±CCYY-AT-M ±4-A1-1 -AT-M -A1-1
m/t/y ±CCYY-AT-MM ±4-A1-M1 -AT-MM -A1-M1
w/t/y ±CCYY-AT-WWW ±4-A1-W2 -AT-WWW -A1-W2
w/m/t/y ±CCYY-AT-MM-WW ±4-A1-M1-W1 -AT-MM-WW -A1-M1-W1
d/m/t/y ±CCYY-AT-M-DD ±4-A1-1-2 -AT-M-DD -A1-1-2
d/w/t/y ±CCYY-AT-WWW-D ±4-A1-W2-1 -AT-WWW-D -A1-W2-1

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.

Equivalence to ISO “sub-year groupings”
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


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.


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
Constellation dates with digits code
Lunar dates
level of detail full date year implied
m/y ±CCYY-LMM ±4-L2 -LMM -L2
d/m/y ±CCYY-LMM-DD ±4-L2-2 -LMM-DD -L2-2
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
q/y ±CCYY-SQ ±4-S1 -SQ -S1
d/q/y ±CCYY-SQ-DD ±4-S1-2 -SQ-DD -S1-2
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
d/m/y ±CCYY-SMM-DD ±4-S2-2 -SMM-DD -S2-2

Note: ±CCYYL and ±CCYYS are not the same.

Lunar year and months[]

Alphanumeric date format
‘L’ marker
Lunar year
Day of lunation
Weekday of lunation

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.

Lunar months with Hebrew equivalents
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.

Lunar months with Chinese 月 yuè equivalents
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
Astronomic / astrologic year layout (seasons and Western, tropical zodiac signs)
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
Day of season
Sign of season
Day of sign

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.


under construction, not reflected in grammar yet
Proposed shift time formats with digits code
level of detail full time
t/d T 1
h/t/d T:h 1:1
h/t/d T:hh 1:2
m/t/d T:mmm 1:3
Proposed shift date formats with digits code
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
t/w/qw/y ±CCYY-QQ-WWW-TT ±4-Q1-W2-2 -QQ-WWW-TT -Q1-W2-2 -Q-WWW-TT -Q-W2-2
t/w/m/q/y ±CCYY-QQ-M-WW-TT ±4-Q1-1-W1-2 -QQ-M-WW-TT -Q1-1-W1-2
t/w/m13/y ±CCYY-MMM-WW-TT ±4-M2-W1-2 -MMM-WW-TT -M2-W1-2 -M-WW-TT -M-W1-2
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-<##/##>


Existing formats[]

Existing formats with digits code
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.

Proposed formats with digits code
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.


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
Proposed formats for parts of the hour with digit code
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
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?


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
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
Second of 5min interval

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[]

Time zone formats with digits code
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 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>.


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.


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.

Week days of some popular holidays[2]
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
Week days of some national holidays, dow of original date highlighted
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.


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[]

under construction
;; @LICENSE Public Domain, no rights reserved
;; @COMPATIBLE superset of ISO 8601 and RFC 3339
; 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
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                           ;
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
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
; -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] 
; 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]?]]
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 ==