Como posso obter uma data formatada para um carimbo de data / hora UNIX na linha de comando

Eu tenho um carimbo de data / hora UNIX e gostaria de obter uma data formatada (como a saída de date) correspondente a esse carimbo de data / hora.

Minhas tentativas até agora:

$ date +%s 1282367908 $ date -d 1282367908 date: invalid date `1282367908" $ date -d +1282367908 date: invalid date `+1282367908" $ date +%s -d +1282367908 date: invalid date `+1282367908" 

Gostaria de obter resultados como:

$ TZ=UTC somecommand 1282368345 Sat Aug 21 05:25:45 UTC 2010 

Resposta

No Mac OS X e BSD:

$ date -r 1282368345 Sat Aug 21 07:25:45 CEST 2010 $ date -r 1282368345 +%Y-%m-%d 2010-08-21 

com as ferramentas centrais GNU (você tem que vasculhar o arquivo de informações para isso):

$ date -d @1282368345 Sat Aug 21 07:25:45 CEST 2010 $ date -d @1282368345 --rfc-3339=date 2010-08-21 

Com qualquer um deles, adicione a opção -u (padrão) ou passe uma TZ=UTC0 variável de ambiente para ter a data UTC (TZ=UTC0 define um fuso horário chamado UTC com deslocamento 0 do UTC enquanto o comportamento de TZ=UTC (sem deslocamento) não é especificado (embora na maioria dos sistemas se refira a um definido pelo sistema fuso horário também chamado de UTC com deslocamento 0 do UTC)).

Comentários

  • Demora muito de cavar, porém, o que é surpreendente para uma tarefa tão comum.
  • Obrigado, aceito sua resposta. Eu deveria ter lido info coreutils date um pouco mais cuidadosamente.
  • Isso está me dando uma data um pouco diferente: date -r 1447264553943 resultados em Wed Dec 28 01:39:03 BRST 47831, quando ' é realmente 11/11/2015, 3:55:53 PM GMT-2:00.
  • @falmp: funcionará se você usar segundos em vez de microssegundos.
  • @hop ops, deveria ter figurado com o ano sendo 47831, mas esse número era tão alto que perdi. Obrigado!

Resposta

Este one-liner perl fará isso:

$ perl -e "print scalar localtime $ARGV[0]" 1282367908 Sat Aug 21 09:18:28 2010 

Resposta

Depois de pesquisar no Google, descobri uma maneira de fazer isso com date somente comando:

$ date --date "Jan 1, 1970 00:00:00 +0000 + 1282367908 seconds" Sat Aug 21 09:18:28 MSD 2010 

Comentários

  • Obrigado por isso. Eu esperava que ' fosse algo mais simples, então apenas um voto favorável por enquanto.
  • outro ótimo exemplo de como o Google o torna estúpido. ninguém mais lê a documentação?
  • @hop, o suporte para date -d @xxx não foi adicionado até o coreutils 5.3 em 2005. Esse ' é como você tinha que fazer antes disso.
  • @St é phaneChazelas: a) esta resposta é de 2010 eb) por que isso desculpa googling antes de ler a documentação? Se você responder por sua própria autoridade, pode-se desculpar cometer erros como este, mas se você tiver que pesquisar de qualquer maneira, pesquise corretamente.
  • @hop, eu estava apenas apontando que não era uma resposta estúpida, apenas uma desatualizada.

Resposta

Com shell embutido:

  • zsh (4.1.1 (2003) e superior):

    $ zmodload zsh/datetime $ TZ=UTC0 strftime %c 1282368345 Sat 21 Aug 2010 05:25:45 UTC 
  • ksh93 (ksh93i (2000) e superior):

    $ TZ=UTC0 printf "%(%c)T\n" "#1282368345" Sat Aug 21 05:25:45 2010 
  • bash (4.2 (2010) e superior):

    $ TZ=UTC0 printf "%(%c)T\n" 1282368345 Sat 21 Aug 2010 05:25:45 UTC 

Em todos eles, substitua %c pelo formato strftime() que você deseja.

Comentários

Resposta

No osx, para ter em UTC

date -r "1475737200" -u 

Comentários

  • Obrigado. Eu ' editei isso na resposta aceita para que a informação esteja mais prontamente disponível.

Resposta

Responda a uma pergunta antiga, mas acho que pode ser uma melhoria se alguém pesquisar por isso. Esta função Bash funciona em Linux e OS X. Não testei em nenhum outro sistema BSD. Passe o tempo de época como um argumento para esta função e ela imprimirá o formato de hora RFC-3339.

epochtorfc3339 () { RFC3339_FORMAT="+%FT%T:::%z" EPOCH=$(echo $@ | sed -n "s/.*\([0-9]\{10\}\).*/\1/p"); if date --version >/dev/null 2>/dev/null; then # Linux date ${RFC3339_FORMAT} -d "1970-01-01 UTC ${EPOCH} seconds" #date -d @${EPOCH} --rfc-3339=seconds else # OS X/BSD date -r ${EPOCH} ${RFC3339_FORMAT} fi } 

Resposta

Outro exemplo interessante da rica herança do Unix moderno. Isso é realmente possível na maioria das variantes do BSD:

$ TZ=UTC date -r 1282368345 Sat Aug 21 05:25:45 UTC 2010 

(A propósito, seu exemplo parece estar errado por um segundo)

Comentários

  • Não ' funciona no Linux. A resposta de hop ' parece ter a resposta correta do Linux. Obrigado por apontar isso, eu suspeitei que algo assim iria acontecer, eu ' fiz 45 segundos agora.

Deixe uma resposta

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