O comando `date` no OS X não possui a opção ISO-8601` -I`?

193

Em um script Bash, desejo imprimir a data e hora atuais no formato ISO 8601 (preferencialmente UTC) e parece que isso deve ser tão simples quanto date -I:

http://ss64.com/bash/date.html

Mas isso não parece funcionar no meu 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]

E, de fato, man datenão lista essa opção.

Alguém sabe por que isso é ou qualquer outra maneira (fácil) de imprimir a data no formato ISO 8601? Obrigado!

Aseem Kishore
fonte
2
Para esclarecer, quero uma data ISO 8601 completa, incluindo a hora e, de preferência, no fuso horário UTC.
Aseem Kishore 27/08
É melhor apenas editar a pergunta. Em que formato você quer a hora?
precisa saber é o seguinte
@ Tom: ok, editado. Por formato, a ISO 8601 não é específica o suficiente?
Aseem Kishore
Não, a ISO 8601 não é específica o suficiente. Esse padrão especifica um número de formatos de várias precisões. Ambos 2011-08-27e 2011-08-27T18:55:43Zsão formatos ISO 8601. E realmente, editar a pergunta seria mais útil do que distribuir atualizações por vários comentários. Um exemplo do que você está tentando imprimir seria o ideal.
Keith Thompson
6
A instalação do coreutils do GNU usando brew(que usa o prefixo 'g') gdate -Ifuncionou, juntamente com outros sinalizadores do GNU.
Joel Purra

Respostas:

348

Você poderia usar

date "+%Y-%m-%d"

Ou para uma data totalmente compatível com ISO-8601 , use um dos seguintes formatos:

date -u +"%Y-%m-%dT%H:%M:%SZ"

Resultado:

2011-08-27T23:22:37Z

ou

date +%Y-%m-%dT%H:%M:%S%z

Resultado:

2011-08-27T15:22:37-0800
amit_g
fonte
7
Tecnicamente, o "T" é recomendado, mas opcional, na ISO 8601. Usar um espaço em vez de 'T' seria: date -u + "% Y-% m-% d% H-% M-% SZ"
Basil Bourque
Finalmente! Eu adicionei isso ao meu bash_alias
Christian Bongiorno
Sim, resposta incrível Obrigado !, mas date -u +"%Y-%m-%dT%H:%MZ"era exatamente isso que eu estava procurando.
ChikuMiku
3
@mbigras: Ze +00:00são os mesmos (principalmente). Para fins de tradução do tempo, ambos significam UTC. No entanto, a Inglaterra é +00:00no inverno e +01:00no verão (BST).
Jeffrey Hulten
5
@JeffreyHulten: "ambos significam UTC" - Nitpick, mas Zé UTC, enquanto +00:00é GMT. O UTC não é um fuso horário e não possui um deslocamento; deslocamento é definido como a diferença de tempo entre um fuso horário e o UTC, o padrão de medição de tempo. GMT é +00: 00 removido do UTC (e BST é, como você diz, +01: 00 removido do UTC).
Amadan
57

Na data GNU date -Ié o mesmo que date +%F, e -Isecondse -Iminutestambém incluem o tempo com UTC offset.

$ 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é como TZ=UTC. +00:00pode ser substituído por Z.

$ date -u +%FT%TZ
2013-05-03T12:59:24Z

Estes também são formatos de data ou hora ISO 8601 válidos:

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)

Estes não são:

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)
Lri
fonte
3
hooray para + "% FT% T% z", que é exatamente o que eu precisava
Noah Yetter
22

Uma alternativa curta que funciona nas datas GNU e BSD é:

date -u +%FT%T%z
SomeGuy
fonte
7
ou date -u +%FT%TZporque em offset UTC seria zero de qualquer maneira
akostadinov
15

O pacote coreutils fornece versões GNU de ferramentas. Para instalar:

$ brew install coreutils

Você pode ver o que é fornecido:

$ brew list coreutils

Observe que ele vem com data:

$ brew list coreutils | grep date

Este é o comando padrão do GNU date, portanto, será necessário a opção -I:

$ gdate -I
2016-08-09
slm
fonte
1
Ou:: gdate --iso-8601=ns2016-09-29T16: 54: 23,485230000 + 02: 00
Olivier
5

Basta usar as dateopções de formatação normal :

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

Editar: para incluir hora e UTC, são equivalentes:

date -u -Iseconds

date -u '+%Y-%m-%dT%k:%M:%S%z'
Tom Zych
fonte
Foi adicionado um comentário ao meu OP, esclarecendo que eu quero a data completa, incluindo a hora e, de preferência, no fuso horário UTC. Obrigado pela dica!
Aseem Kishore
3

Não é um recurso do Bash, é um recurso do datebinário. No Linux, você normalmente teria a versão GNU coreutils date, enquanto no OSX, os utilitários herdados do BSD. A versão GNU certamente pode ser instalada como um pacote opcional, ou você pode instalar seu próprio substituto - acredito que deve ser uma linha única, por exemplo, no Perl.

triplo
fonte
Interessante, obrigado. Eu sou do tipo Mac / Linux / Unix / Bash noob; você se importaria de elaborar o coreutils e como instalá-lo no Mac? Obrigado!
Aseem Kishore
2

Tomando as outras respostas um passo adiante, você pode adicionar uma função ao seu ~ / .bashrc ou ~ / .zshrc para adicionar o -Isinalizador de data :

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