`date` command on OS X doesn't have ISO 8601 `-I` option?

BashMacosIso8601

Bash 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:

http://rudix.org/packages-abc.html#coreutils.

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.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAseem KishoreView Question on Stackoverflow
Solution 1 - Bashamit_gView Answer on Stackoverflow
Solution 2 - BashLriView Answer on Stackoverflow
Solution 3 - BashSomeGuyView Answer on Stackoverflow
Solution 4 - BashslmView Answer on Stackoverflow
Solution 5 - BashTom ZychView Answer on Stackoverflow
Solution 6 - Bashruby_slingerView Answer on Stackoverflow
Solution 7 - BashtripleeeView Answer on Stackoverflow
Solution 8 - BashtonykView Answer on Stackoverflow
Solution 9 - BashBrian AmpolskView Answer on Stackoverflow