### B.1 General date syntax ¶

A date is a string, possibly empty, containing many items separated by whitespace. The whitespace may be omitted when no ambiguity arises. The empty string means the beginning of today (i.e., midnight). Order of the items is immaterial. A date string may contain many flavors of items:

- calendar date items
- time of day items
- time zone items
- day of the week items
- relative items
- pure numbers.

We describe each of these item types in turn, below.

A few ordinal numbers may be written out in words in some contexts. This is most useful for specifying day of the week items or relative items (see below). Among the most commonly used ordinal numbers, the word ‘`last`’ stands for -1, ‘`this`’ stands for 0, and ‘`first`’ and ‘`next`’ both stand for 1. Because the word ‘`second`’ stands for the unit of time there is no way to write the ordinal number 2, but for convenience ‘`third`’ stands for 3, ‘`fourth`’ for 4, ‘`fifth`’ for 5, ‘`sixth`’ for 6, ‘`seventh`’ for 7, ‘`eighth`’ for 8, ‘`ninth`’ for 9, ‘`tenth`’ for 10, ‘`eleventh`’ for 11 and ‘`twelfth`’ for 12.

When a month is written this way, it is still considered to be written numerically, instead of being “spelled in full”; this changes the allowed strings.

In the current implementation, only English is supported for words and abbreviations like ‘`AM`’, ‘`DST`’, ‘`EST`’, ‘`first`’, ‘`January`’, ‘`Sunday`’, ‘`tomorrow`’, and ‘`year`’.

The output of the `date` command is not always acceptable as a date string, not only because of the language problem, but also because there is no standard meaning for time zone items like ‘`IST`’. When using `date` to generate a date string intended to be parsed later, specify a date format that is independent of language and that does not use time zone items other than ‘`UTC`’ and ‘`Z`’. Here are some ways to do this:

    $ LC_ALL=C TZ=UTC0 date
    Mon Mar  1 00:21:42 UTC 2004
    $ TZ=UTC0 date +'%Y-%m-%d %H:%M:%SZ'
    2004-03-01 00:21:42Z
    $ date --iso-8601=ns | tr T ' '  # --iso-8601 is a GNU extension.
    2004-02-29 16:21:42,692722128-0800
    $ date --rfc-2822  # a GNU extension
    Sun, 29 Feb 2004 16:21:42 -0800
    $ date +'%Y-%m-%d %H:%M:%S %z'  # %z is a GNU extension.
    2004-02-29 16:21:42 -0800
    $ date +'@%s.%N'  # %s and %N are GNU extensions.
    @1078100502.692722128

Alphabetic case is completely ignored in dates. Comments may be introduced between round parentheses, as long as included parentheses are properly nested. Hyphens not followed by a digit are currently ignored. Leading zeros on numbers are ignored.

Invalid dates like ‘`2005-02-29`’ or times like ‘`24:00`’ are rejected. In the typical case of a host that does not support leap seconds, a time like ‘`23:59:60`’ is rejected even if it corresponds to a valid leap second.