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

59

Eu tenho um registro de data e hora do UNIX e gostaria de obter uma data formatada (como a saída de date) correspondente a esse registro de data e 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'

Eu gostaria de conseguir resultados como:

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

Respostas:

92

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 principais do GNU (você precisa pesquisar 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, adicione a -uopção (padrão) ou passe uma TZ=UTC0variável de ambiente para ter a data UTC ( TZ=UTC0 define um fuso horário chamado UTCcom deslocamento 0 do UTC, enquanto o comportamento de TZ=UTC(sem deslocamento) não é especificado (embora na maioria dos sistemas se refira a um fuso horário definido pelo sistema também chamado UTCcom deslocamento 0 do UTC)).

Stéphane Chazelas
fonte
11
É preciso muita escavação, o que é surpreendente para uma tarefa tão comum.
David Z
Obrigado, aceite sua resposta. Eu deveria ter lido info coreutils dateum pouco mais cuidadosamente.
Umang
Isso está me dando uma data um pouco diferente: date -r 1447264553943resulta Wed Dec 28 01:39:03 BRST 47831quando é realmente 11/11/2015, 3:55:53 PM GMT-2:00.
falmp
11
@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 eu perdi. Obrigado!
falmp
6

Depois de pesquisar no Google, encontrei uma maneira de fazer isso apenas com o datecomando:

$ date --date "Jan 1, 1970 00:00:00 +0000 + 1282367908 seconds"
Sat Aug 21 09:18:28 MSD 2010
AlexD
fonte
Obrigado por isso. Eu esperava que houvesse algo mais simples, então apenas uma votação por enquanto.
Umang
Outro ótimo exemplo de como o Google faz você ser estúpido. ninguém mais lê a documentação?
11
@hop, o suporte para date -d @xxxnão foi adicionado até o coreutils 5.3 em 2005. Foi assim que você teve que fazer isso antes disso.
Stéphane Chazelas
@ StéphaneChazelas: a) essa resposta é de 2010 eb) por que isso justifica pesquisar no Google antes de ler a documentação? Se você responder por sua própria autoridade, pode-se desculpar-se de cometer erros como esse, mas se você precisar procurar de qualquer maneira, procure-o corretamente.
@hop, eu estava apenas apontando que não era uma resposta estúpida, apenas uma resposta desatualizada.
Stéphane Chazelas
6

Este one-liner perl fará isso:

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

Com shell embutido:

  • zsh (4.1.1 (2003) e acima):

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

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

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

Em todos esses, substitua %cpelo strftime()formato desejado.

Stéphane Chazelas
fonte
Você tem uma referência para a bash printfsolução?
Derek Mahar
Deixa pra lá , eu encontrei na descrição de printfem gnu.org/software/bash/manual/bashref.html#Bash-Builtins .
Drek Mahar
2

No osx, para ter no UTC

date -r "1475737200" -u
qualquer um
fonte
Obrigado. Eu editei isso na resposta aceita para que as informações fiquem mais prontamente disponíveis.
Stéphane Chazelas
1

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

(BTW, seu exemplo parece estar errado em um segundo)

codehead
fonte
Não funciona no Linux. A resposta de hop parece ter a resposta correta do Linux. Obrigado por apontar isso, eu suspeitava que algo assim iria acontecer, eu fiz 45 segundos agora.
Umang
1

Responda a uma pergunta antiga, mas acho que isso pode ser uma melhoria se alguém procurar por isso. Essa função do Bash funciona no Linux e no OS X. Não testei em nenhum outro sistema BSD. Passe a hora da época como 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
}
Noah Spurrier
fonte