Команда `date` в OS X не имеет опции ISO 8601` -I`? - PullRequest
164 голосов
/ 27 августа 2011

В сценарии 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? Спасибо!

Ответы [ 8 ]

299 голосов
/ 27 августа 2011

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

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
54 голосов
/ 03 мая 2013

В 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)
20 голосов
/ 07 декабря 2015

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

date -u +%FT%T%z
15 голосов
/ 09 августа 2016

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

$ brew install coreutils

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

$ brew list coreutils

Обратите внимание, это приходит с датой:

$ brew list coreutils | grep date

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

$ gdate -I
2016-08-09
5 голосов
/ 27 августа 2011

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

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

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

date -u -Iseconds

date -u '+%Y-%m-%dT%k:%M:%S%z'
2 голосов
/ 11 октября 2018

Взяв другие ответы на шаг вперед, вы можете добавить функцию в ~ / .bashrc или ~ / .zshrc, чтобы добавить дату -I флаг:

date() {
  if [ "$1" = "-I" ]; then
    command date "+%Y-%m-%dT%H:%M:%S%z"
  else
  command date "$@"
  fi
}
2 голосов
/ 27 августа 2011

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

1 голос
/ 28 августа 2011

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

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

...