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


194

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


2
Чтобы уточнить, я хочу полную дату ISO 8601, включая время и предпочтительно в часовом поясе UTC.
Асем Кишоре

Лучше просто отредактировать вопрос. В каком формате вы хотите время?
Том Зыч

@ Том: хорошо, отредактировано. По формату ISO 8601 недостаточно конкретен?
Асем Кишоре

Нет, ISO 8601 недостаточно конкретен. Этот стандарт определяет ряд форматов различной точности. И то, 2011-08-27и другое 2011-08-27T18:55:43Z- форматы ISO 8601. И действительно, редактирование вопроса было бы более полезным, чем рассредоточение обновлений по нескольким комментариям. Пример того, что вы пытаетесь напечатать, будет идеальным.
Кит Томпсон

6
Установив GNU coreutils с помощью brew(который использует префикс 'g'), gdate -Iон работал вместе с другими флагами GNU.
Джоэл Пурра

Ответы:


349

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

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

7
Технически, буква "T" рекомендуется, но необязательна в ISO 8601. Использование пробела вместо 'T' будет следующим: date -u + "% Y-% m-% d% H-% M-% SZ"
Basil Bourque

В заключение! Я добавил это в мой bash_alias
Кристиан Бонджорно

Да, потрясающий ответ. Спасибо !, но это date -u +"%Y-%m-%dT%H:%MZ"именно то, что я искал.
ChikuMiku

3
@mbigras: Zи +00:00одинаковы (в основном). В целях перевода времени они оба означают UTC. Однако Англия +00:00зимой и +01:00летом (BST).
Джеффри

5
@JeffreyHulten: «они оба означают UTC» - Nitpick, но Zэто UTC, а время +00:00GMT. UTC не является часовым поясом и не имеет смещения; Смещение определяется как разница во времени между часовым поясом и UTC, стандартом измерения времени. Время по Гринвичу +00: 00 удалено из UTC (а BST, как вы говорите, +01: 00 удалено из UTC).
Амадан

57

В 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)

3
ура для + "% FT% T% z" это именно то, что мне было нужно
Ной Йеттер


15

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

$ brew install coreutils

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

$ brew list coreutils

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

$ brew list coreutils | grep date

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

$ gdate -I
2016-08-09

1
Или:: gdate --iso-8601=ns2016-09-29T16: 54: 23,485230000 + 02: 00
Оливье

5

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

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

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

date -u -Iseconds

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

Добавил комментарий к моему OP, пояснив, что мне нужна полная дата, включая время, и желательно в часовом поясе UTC. Спасибо за совет, хотя!
Асем Кишоре

3

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


Интересно, спасибо. Я вроде Mac / Linux / Unix / Bash Noob; Не могли бы вы рассказать о coreutils и о том, как установить его на Mac? Спасибо!
Асем Кишоре

2

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

date() {
  if [ "$1" = "-I" ]; then
    command date "+%Y-%m-%dT%H:%M:%S%z"
  else
  command date "$@"
  fi
}

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.