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

O comando date não oferece tal coisa, o que é meio triste, já que RFC-3339 é o formato moderno, difundido e lógico usado em todos os lugares (exceto em e-mail, que não é moderno nem lógico).

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

Comentários

  • Em quais padrão (s) você está interessado in?
  • Pessoalmente, estou bem com 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 especifique a precisão do subsegundo (número de dígitos diferentes de 0 ou 9).
  • É ‘ s não um formato lógico: o total a ausência de espaços em branco torna desnecessariamente difícil para humanos lerem. Você deve usar uma pequena variação 2013-09-05 14:58:33.102 -0800, exceto quando houver s alguma razão pela qual os espaços não devem ser usados.
  • Eu estava comparando com o formato de data de correio (RFC 822, 2822) que é difícil de ler tanto para humanos quanto para máquinas.

Resposta

Parece que você pode fazer vários formatos usando a mudança para a implementação GNU de 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ê quiser que T seja adicionado, como um hack:

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

Se quiser em milissegundos :

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

Referências

Comentários

  • Atualmente, nenhum hack é necessário para obter o ‘ T ‘. O --iso-8601' option accepts the same arguments as –rfc-3339`, e inclui o ‘ T ‘ em seu saída.
  • parte Sed s/\(\....\).*-/\1-/g deve ser s/\(\....\).*\([+-]\)/\1\2/g para também funcionar a leste do Atlântico.
  • @svante – obrigado pelo detalhe, corrigido.
  • @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 em vez disso. Leia a ietf.org/rfc/rfc3339.txt Seção 5.6
  • @ rwenz3l Minha culpa. Acabei de ler apenas parte do ABNF e perdi as notas. Obrigado por apontar!

Resposta

Com GNU date (5,90 ou superior):

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

Substitua %N por %3N por milissegundos, %6N por microssegundos …

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

POSIX / Unix / LSB strftime suporta %z para exibir o deslocamento TZ como -0800, então o mais portátil que você provavelmente terá é:

 $ 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 

Resposta

Você também pode formatar o tempo de acordo com RFC3339 (ISO8601) mais facilmente:

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

NOTA: Este formulário at também é usado na Convenção de esquema de rótulo RC 1.0

Comentários

  • 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ê quiser passar UTC -u sinalizador, que zera a diferença de fuso horário.
  • Com o sinalizador -u, esta resposta está correta, certo?
  • @briceburg por que este não é válido RFC3339? De acordo com tools.ietf.org/html/rfc3339#section-5.6 , parece estar correto, tanto quanto posso dizer.

Resposta

GNU date tem o formato ISO-8601 embutido – não é isso bastante próximo ou mesmo idêntico ao RFC-3339?

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

Comentários

  • ISO-8601 permite diferentes formatação de datas e horas, mas acho que o OP está solicitando especificamente o formato de W3C Date ” Data completa mais horas, minutos, segundos e um 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 W3C .

Resposta

Que tal o bom e velho:

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

Comentários

  • Onde estão as informações de fuso horário?
  • Isso funciona tanto no Mac quanto no Linux ‘ date ‘
  • Que tal milissegundos?
  • observação rápida aqui, sem abrir o RFC, o segmento de fuso horário, 0200 está faltando dois pontos, o que pode quebrar alguns sistemas que exigem isso.
  • @MikeMackintosh ‘ A nota é pertinente; a saída mostrada aqui não é uma data RFC 3339 válida. Os dois pontos no segmento de fuso horário são necessários para RFC 3339; veja a definição de time-numoffset em tools.ietf.org/html/rfc3339#section-5.6 .

Resposta

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 a exceção da %z especificação de conversão. No entanto, %z é amplamente suportado e funciona da mesma maneira em Linux, MacOS, FreeBSD, OpenBSD, NetBSD, DragonFlyBSD, Solaris, Minix e Haiku. Ele também funciona com as ferramentas no Busybox, Toybox e sbase (os utilitários do sistema de base suckless.org). Uma vez que %z gera o deslocamento de fuso horário no formato ±HHMM, precisamos do sed pipe para adicionar dois pontos e altere-o para ±HH:MM.

NOTA: O comando Heirloom project “s date tem incompatível %z saída: não imprime um sinal +.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *