date command –iso-8601 option
This answer and comments mention --rfc-3339
and a “hidden” --iso-8601
option that I have used for a long time and now seems to be undocumented.
When did that option documentation get removed from the --help
text?
Will the option go away anytime soon?
The option was introduced in the coreutils date
(which is probably what you have) in 1999 (Apr. 8).
The documentation was removed in 2005 without much explanation in the commit.
In 2011, the help for –iso-8601 was reintroduced with the following explanation:
We deprecated and undocumented the --iso-8601 (-I) option mostly
because date could not parse that particular format. Now that
it can, it's time to restore the documentation.
* src/date.c (usage): Document it.
* doc/coreutils.texi (Options for date): Reinstate documentation.
Reported by Hubert Depesz Lubaczewski in http://bugs.gnu.org/7444.
It looks like the help was taken out in version 5.90 and put back in, in version 8.15 (it is not in my 8.13) and the comment above suggests that it is now back to stay and not likely to be disappearing any time soon.
In version 8.31 (as provided by Solus July 2020) the man page descriptions for two two options are:
-I[FMT], --iso-8601[=FMT]
output date/time in ISO 8601 format. FMT='date' for date only (the default), 'hours', 'minutes', 'sec‐
onds', or 'ns' for date and time to the indicated precision. Example: 2006-08-14T02:34:56-06:00
--rfc-3339=FMT
output date/time in RFC 3339 format. FMT='date', 'seconds', or 'ns' for date and time to the indicated
precision. Example: 2006-08-14 02:34:56-06:00
The –help got an update recently actually, so the option definitely isn’t going away:
-I[FMT], --iso-8601[=FMT] output date/time in ISO 8601 format.
FMT='date' for date only (the default),
'hours', 'minutes', 'seconds', or 'ns'
for date and time to the indicated precision.
Example: 2006-08-14T02:34:56-06:00
-R, --rfc-2822 output date and time in RFC 2822 format.
Example: Mon, 14 Aug 2006 02:34:56 -0600
--rfc-3339=FMT output date/time in RFC 3339 format.
FMT='date', 'seconds', or 'ns'
for date and time to the indicated precision.
Example: 2006-08-14 02:34:56-06:00
Note since coreutils-8.27 --rfc-2822
is deprecated in favor of the more general --rfc-email
-R, --rfc-email output date and time in RFC 5322 format.
Example: Mon, 14 Aug 2006 02:34:56 -0600
I’m running Linux Mint and the option is available:
$ lsb_release -a
No LSB modules are available.
Distributor ID: LinuxMint
Description: Linux Mint 17.3 Rosa
Release: 17.3
Codename: rosa
The execution of the command:
$ date --iso-8601=seconds
2016-12-14T09:53:25-0400
For a platform independent, (almost) fully compliant, ISO 8601 date,
use this:
date +"%Y-%m-%dT%H:%M:%S%z"
This will result in a time such as: 2021-01-16T23:09:44-0500
This should work on macOS (BSD) and Linux.
Technically, for full compliance, it should be:
date +"%Y-%m-%dT%H:%M:%S%:z"
Note the offset (time zone) field
contains a colon ‘:
‘ between the ‘%
‘ and the ‘z
‘.
This will result in a fully complaint ISO 8601 time such as: 2021-01-16T23:09:44-05:00
But this doesn’t work on macOS (as of this writing).
This should work on Linux (i.e., with GNU date
).
For UTC time (zero offset, historically known as "Zulu time")
you can use (note the -u
, to get UTC time,
and note that the ‘Z
‘ is not preceded by a ‘%
‘ (or a colon)
– it is a literal ‘Z
‘):
date -u +"%Y-%m-%dT%H:%M:%SZ"
This will result in a time such as: 2021-01-17T04:16:14Z
I think this is perfect, maybe you will also like it:
date -u --iso-8601=ns | sed s/+00:00/Z/ | sed s/,/./
Result example: 2022-12-10T20:44:36.753578818Z