Команда `date` на OS X не имеет опции ISO-8601` -I`?

В Bash script, я хочу напечатать текущее время-время в формате ISO 8601 (желательно UTC), и кажется что это должно быть так же просто, как date -I:

http://ss64.com/bash/date.html

Но это не работает на моем 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]

И действительно, man date не перечисляет эту опцию.

Кто-нибудь знает, почему это так, или любой другой (простой) способ распечатать дату в формате ISO 8601? Спасибо!

Ответ 1

Вы можете использовать

date "+%Y-%m-%d"

Или для полностью даты, совместимой с ISO-8601, используйте один из следующих форматов:

date -u +"%Y-%m-%dT%H:%M:%SZ"

Вывод:

2011-08-27T23:22:37Z

или

date +%Y-%m-%dT%H:%M:%S%z

Вывод:

2011-08-27T15:22:37-0800

Ответ 2

В GNU date date -I совпадает с date +%F, а -Iseconds и -Iminutes также включают время с смещением UTC.

$ 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 похож на TZ=UTC. +00:00 можно заменить на Z.

$ date -u +%FT%TZ
2013-05-03T12:59:24Z

Это также действительные форматы даты или времени ISO 8601:

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)

Это не:

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)

Ответ 3

Короткий вариант, который работает как на дату GNU, так и на BSD:

date -u +%FT%T%z

Ответ 4

Пакет coreutils предоставляет версии инструментов GNU. Чтобы установить:

$ brew install coreutils

Вы можете видеть, что предоставлено:

$ brew list coreutils

Обратите внимание, что он поставляется с датой:

$ brew list coreutils | grep date

Это стандартная команда даты GNU, поэтому она будет иметь переключатель -I:

$ gdate -I
2016-08-09

Ответ 5

Просто используйте стандартные параметры форматирования date:

date '+%Y-%m-%d'

Изменить: включить время и UTC, они эквивалентны:

date -u -Iseconds

date -u '+%Y-%m-%dT%k:%M:%S%z'

Ответ 6

Это не особенность Bash, это особенность двоичного файла date. В Linux у вас обычно есть версия GNU coreutils date, тогда как на OSX у вас есть устаревшие утилиты BSD. Версия GNU, безусловно, может быть установлена ​​как дополнительный пакет, или вы можете свернуть свою собственную замену - я считаю, что это должен быть простой однострочный, например. в Perl.