Команда `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.
Асеем Кішор

Краще просто відредагувати питання. У якому форматі ви хочете провести час?
Том Зіч

@Tom: добре, відредаговано. Чи форма ISO 8601 недостатньо конкретна?
Aseem Kishore

Ні, ISO 8601 недостатньо конкретний. Цей стандарт визначає низку форматів різних точок. Обидва 2011-08-27і 2011-08-27T18:55:43Zє форматами ISO 8601. І дійсно, редагування питання було б кориснішим, ніж розсіювання оновлень на кілька коментарів. Приклад того, що ви намагаєтеся надрукувати, був би ідеальним.
Кіт Томпсон

6
Встановивши GNU coreutils за допомогою brew(який використовує префікс 'g'), gdate -Iвін працював разом з іншими прапорами GNU.
Джоел Пурра

Відповіді:


348

Ви можете використовувати

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
Технічно "ISO" рекомендується, але необов'язково в ISO 8601. Використовувати пробіл замість "T" було б: дата -u + "% Y-% m-% d% H-% M-% SZ"
Василь Бурк

Нарешті! Я додав це до свого bash_alias
Крістіан

Так, чудова відповідь Спасибі !, але date -u +"%Y-%m-%dT%H:%MZ"саме цього я шукав.
ChikuMiku

3
@mbigras: Zі +00:00однакові (здебільшого). Для перекладу часу вони обоє означають UTC. Однак Англія є +00:00взимку і +01:00влітку (BST).
Джефрі Халтен

5
@JeffreyHulten: "вони обидва означають UTC" - Нітпік, але Zце UTC, тоді +00:00як GMT. UTC не є часовим поясом і не має зміщення; Зсув визначається як різниця в часі між часовим поясом і UTC, стандарт вимірювання часу. GMT +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", саме це мені і потрібно
Ной Ітер

22

Коротка альтернатива, яка працює як на дату GNU, так і на BSD:

date -u +%FT%T%z

7
або date -u +%FT%TZтому, що в UTC зміщення все одно буде нульовим
akostadinov

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'

Додав коментар до моєї оперативної програми, пояснивши, що я хочу отримати повну дату, включаючи час та бажано в часовому поясі UTC. Дякую за пораду, хоча!
Асеем Кішор

3

Це не особливість Баша, це особливість 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.