`date` command on OS X doesn't have ISO 8601 `-I` option?
BashMacosIso8601Bash Problem Overview
In a Bash script, I want to print the current datetime in ISO 8601 format (preferably UTC), and it seems that this should be as simple as date -I
:
http://ss64.com/bash/date.html
But this doesn't seem to work on my Mac:
$ date -I
date: illegal option -- I
usage: date [-jnu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ...
[-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format]
And indeed, man date
doesn't list this option.
Anyone know why this is, or any other (easy) way for me to print the date in ISO 8601 format? Thanks!
Bash Solutions
Solution 1 - Bash
You could use
date "+%Y-%m-%d"
Or for a fully ISO-8601 compliant date, use one of the following formats:
date -u +"%Y-%m-%dT%H:%M:%SZ"
Output:
2011-08-27T23:22:37Z
or
date +%Y-%m-%dT%H:%M:%S%z
Output:
2011-08-27T15:22:37-0800
Solution 2 - Bash
In GNU date date -I
is the same as date +%F
, and -Iseconds
and -Iminutes
also include time with UTC offset.
$ date +%F # -I or +%Y-%m-%d
2013-05-03
$ date +%FT%T%z # -Iseconds or +%Y-%m-%dT%H:%M:%S%z
2013-05-03T15:59:24+0300
$ date +%FT%H:%M # -Iminutes or +%Y-%m-%dT%H:%M%z
2013-05-03T15:59+0300
-u
is like TZ=UTC
. +00:00
can be replaced with Z
.
$ date -u +%FT%TZ
2013-05-03T12:59:24Z
These are also valid ISO 8601 date or time formats:
20130503T15 (%Y%m%dT%M)
2013-05 (%Y%m)
2013-W18 (%Y-W%V)
2013-W18-5 (%Y-W%V-%u)
2013W185 (%YW%V%u)
2013-123 (%Y-%j, ordinal date)
2013 (%Y)
1559 (%H%M)
15 (%H)
15:59:24+03 (UTC offset doesn't have to include minutes)
These are not:
2013-05-03 15:59 (T is required in the extended format)
201305 (it could be confused with the YYMMDD format)
20130503T15:59 (basic and exteded formats can't be mixed)
Solution 3 - Bash
A short alternative that works on both GNU and BSD date is:
date -u +%FT%T%z
Solution 4 - Bash
The coreutils package provides GNU versions of tools. To install:
$ brew install coreutils
You can see what's provided:
$ brew list coreutils
Notice it comes with date:
$ brew list coreutils | grep date
This is the standard GNU date command so it'll take the -I switch:
$ gdate -I
2016-08-09
Solution 5 - Bash
Just use normal date
formatting options:
date '+%Y-%m-%d'
Edit: to include time and UTC, these are equivalent:
date -u -Iseconds
date -u '+%Y-%m-%dT%k:%M:%S%z'
Solution 6 - Bash
Taking the other answers one step further, you could add a function to your ~/.bashrc or ~/.zshrc to add the date -I
flag:
date() {
if [ "$1" = "-I" ]; then
command date "+%Y-%m-%dT%H:%M:%S%z"
else
command date "$@"
fi
}
Solution 7 - Bash
It's not a feature of Bash, it's a feature of the date
binary. On Linux you would typically have the GNU coreutils version of date
, whereas on OSX you would have the BSD legacy utilities. The GNU version can certainly be installed as an optional package, or you can roll your own replacement - I believe it should be a simple one-liner e.g. in Perl.
Solution 8 - Bash
There's a precompiled coreutils
package for Mac OS X available at:
Solution 9 - Bash
I regularly use 'date -I' in Linux when saving files. ex: touch x.date -I
. While the equivalent in MacOS is 'date +%F', it is a bit awkward to type every time I save a file. So, I set an alias "alias dt='date +%F'" then touch x.dt
gives me the date.