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.
Published under the terms of the GNU General Public License