Команда `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.
Ответ 7
Существует предварительно скомпилированный пакет coreutils
для Mac OS X, доступный по адресу:
http://rudix.org/packages-abc.html#coreutils.