O que é um comando padrão para imprimir uma data no formato RFC-3339?


18

O datecomando não oferece esse tipo de coisa, o que é meio triste, já que o RFC-3339 é o formato moderno, amplo e sensato usado em todos os lugares (exceto no e-mail que não é moderno nem sensato).

Meu deslocamento de fuso horário atualmente é -08: 00, portanto, a forma mais simples deste comando deve imprimir o horário atual como 2013-09-05T14:58:33.102-08:00.


Em quais padrões você está interessado?
Stéphane Chazelas 19/03/14

Pessoalmente, estou bem com o GNU, mas no grande esquema das coisas, ele realmente deve ser mais amplo do que isso. Ele também deve vir com um padrão razoável (opção curta, precisão de milissegundos) e ter uma maneira de especificar a precisão de subsegundos (número de dígitos que não seja 0 ou 9).
Martin Jambon

1
É não um formato sã: a ausência total de espaço em branco torna desnecessariamente difícil para os seres humanos de ler. Você deve usar a leve variação, 2013-09-05 14:58:33.102 -0800exceto quando houver algum motivo pelo qual os espaços não devem ser utilizados.
Zwol 20/03/2014

1
Eu o comparava com o formato de data de correspondência (RFC 822, 2822), que é difícil de ler para humanos e máquinas.
Martin Jambon

Respostas:


30

Parece que você pode fazer vários formatos usando a opção de implementação GNU date(versão 5.90 ou superior) --rfc3339=,.

Exemplos

$ date --rfc-3339=date
2014-03-19

$ date --rfc-3339=seconds
2014-03-19 18:00:05-04:00

$ date --rfc-3339=ns
2014-03-19 18:00:08.179780629-04:00

Se você deseja que o Titem seja adicionado, como um hack:

$ date --rfc-3339=seconds | sed 's/ /T/'
2014-03-19T18:35:03-04:00

Se você quiser em milissegundos:

$ date --rfc-3339=ns | sed 's/ /T/; s/\(\....\).*\([+-]\)/\1\2/g'
2014-03-19T18:42:52.362-04:00

Referências


7
Hoje em dia, nenhum hack é necessário para obter o 'T'. O --iso-8601' option accepts the same arguments as --rfc-3339` e inclui o 'T' em sua saída.
Ti Strga

1
Parte Sed s/\(\....\).*-/\1-/gdeve ser s/\(\....\).*\([+-]\)/\1\2/gtambém trabalhar a leste do Atlântico.
svante 11/09/19

1
@svante - obrigado pelos detalhes, corrigidos.
slm

2
@Eonil que na verdade não está correto, o RFC3339 afirma: NOTE: ISO 8601 defines date and time separated by "T".Enquanto o RFC3339 permite que você use um espaço. Leia ietf.org/rfc/rfc3339.txt Seção 5.6
rwenz3l

1
@ rwenz3l A culpa é minha. Acabei de ler apenas parte do ABNF e perdi as anotações. Obrigado por apontar isso!
Eonil

18

Com o GNU date(5.90 ou superior):

$ TZ=America/Anchorage date '+%FT%T.%N%:z'
2014-03-19T14:29:31.041119357-08:00

Substitua %Ncom %3Na milissegundos, %6Npara micro-segundos ...

AFAIK, nenhuma das especificações POSIX, Unix ou LSB especifica qualquer comando que possa exibir horários com granularidade de segundo de segundo, mas a parte fracionária é opcional no RFC 3339.

O strixime POSIX / Unix / LSB suporta %zexibir o deslocamento TZ como -0800, portanto, o mais portátil que você provavelmente obterá é:

 $ TZ=America/Anchorage perl -MPOSIX -le '$t = strftime "%Y-%m-%dT%T%z",
   localtime; $t =~ s/..$/:$&/; print $t'
 2014-03-19T14:30:23-08:00

8

O GNU datepossui o formato ISO-8601 embutido - não é tão parecido ou até idêntico ao RFC-3339?

1065 % date --iso-8601=seconds
2014-03-19T16:51:16-0600

A ISO-8601 permite formatações diferentes de datas e horas, mas acho que o OP está solicitando especificamente o formato de data do W3C "Data completa mais horas, minutos, segundos e uma fração decimal de um segundo AAAA-MM-DDThh: mm: ss.sTZD (por exemplo, 1997-07-16T19: 20: 30.45 + 01: 00) " - Formatos de data e hora do W3C .
hakre

8

Que tal bons velhos:

$ date +%Y-%m-%dT%T%z
2015-10-29T14:47:06+0200

Onde estão as informações de fuso horário?
Raphael Ahrens

Isso funciona tanto no Mac e Linux 'date'
Eran Chetzroni

1
Que tal milissegundos?
Martin Jambon

6
observação rápida aqui, sem abrir o RFC, o segmento de fuso horário, 0200está faltando dois pontos, o que pode quebrar alguns sistemas que o exigem.
Mike Mackintosh

2
A nota de @ MikeMackintosh é pertinente; a saída mostrada aqui não é uma data legal da RFC 3339. Os dois pontos no segmento de fuso horário são necessários para o RFC 3339; veja a definição de time-numoffsetpelo tools.ietf.org/html/rfc3339#section-5.6 .
Mark Amery

7

Você também pode formatar a hora de acordo com a RFC3339 (ISO8601) com mais facilidade:

$ date -u +"%Y-%m-%dT%H:%M:%SZ"
2016-11-08T08:52:55Z

NOTA: Este formato também é usado no Label Schema Convention RC 1.0


Esse não é um RFC3339 válido. A resposta de Eran de `` data +% Y-% m-% dT% T% z `` `está correta e com menos caracteres. Se você desejar no sinalizador UTC pass -u, que zerará o deslocamento do fuso horário.
briceburg

Com a -ubandeira, esta resposta está correta, certo?
Lassi

0
echo "Local date only:"
date '+%Y-%m-%d'
echo
echo "Local date and time:"
date '+%Y-%m-%dT%H:%M:%S%z' | sed 's@^.\{22\}@&:@'
echo
echo "UTC date and time:"
date -u '+%Y-%m-%dT%H:%M:%SZ'

Esses comandos são compatíveis com POSIX, com exceção da %zespecificação de conversão. No entanto, %zé amplamente suportado e funciona da mesma maneira no Linux, MacOS, FreeBSD, OpenBSD, NetBSD, DragonFlyBSD, Solaris, Minix e Haiku. Também funciona com as ferramentas do Busybox, Toybox e sbase (os utilitários do sistema básico do suckless.org). Como %zgera o deslocamento do fuso horário no ±HHMMformato, precisamos do sedcanal para adicionar dois pontos e alterá-lo para ±HH:MM.

NOTA: O datecomando do projeto Heirloom possui uma %zsaída incompatível : não imprime um +sinal.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.