команда "дата" в OS X не имеет опции ISO 8601 "- I"?


в скрипте Bash я хочу напечатать текущую дату и время в 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? Спасибо!

7 134

7 ответов:

вы могли бы использовать

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

в GNU дата 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)

короткая альтернатива, которая работает как на GNU, так и на BSD date:

date -u +%FT%T%z

пакет coreutils предоставляет версии инструментов GNU. Для установки:

$ brew install coreutils

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

$ brew list coreutils

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

$ brew list coreutils | grep date

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

$ gdate -I
2016-08-09

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

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

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

date -u -Iseconds

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

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

есть предварительно скомпилированный coreutils пакет для Mac OS X доступен по адресу:

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