Converter carimbo de data / hora do Unix em uma sequência de datas

128

Existe uma maneira rápida e simples de converter um registro de data e hora do Unix para uma data na linha de comando do Unix?

datepode funcionar, exceto que é bastante estranho especificar cada elemento (mês, dia, ano, hora etc.), e não consigo descobrir como fazê-lo funcionar corretamente. Parece que pode haver uma maneira mais fácil - estou perdendo alguma coisa?

chimeracoder
fonte

Respostas:

181

Com os GNU's, datevocê pode:

date -d "@$TIMESTAMP"
# date -d @0
Wed Dec 31 19:00:00 EST 1969

(De: BASH: Converter carimbo de data e hora do Unix em uma data )

No OS X, use date -r.

date -r "$TIMESTAMP"

Como alternativa, use strftime(). Ele não está disponível diretamente no shell, mas você pode acessá-lo via gawk . O %cespecificador exibe o registro de data e hora de maneira dependente da localidade.

echo "$TIMESTAMP" | gawk '{print strftime("%c", $0)}'
# echo 0 | gawk '{print strftime("%c", $0)}'
Wed 31 Dec 1969 07:00:00 PM EST
John Kugelman
fonte
3
Certifique-se de eliminar os milissegundos do registro de data e hora (que são apenas 10 dígitos em vez de 13), caso contrário, você obterá resultados inválidos (isso é válido para a data do macOS).
emerino
Eu pensei que isso não estava funcionando, até que eu percebi que tinha um carimbo de data / hora em milis. Cortar os últimos 3 dígitos, e você obterá o tempo exato
Stewart
64

date -d @1278999698 +'%Y-%m-%d %H:%M:%S' Onde o número atrás @é o número em segundos

qbi
fonte
28
No OSX 10.8, é date -r 1278999698 +'%Y-%m-%d %H:%M:%S'(GMT) ou simplesmentedate -r 1278999698
Tom McKenzie
Works for Ubuntu 16.04
Mike Q
24

Esta solução funciona com versões da data que não suportam date -d @. Não requer AWK ou outros comandos. Um registro de data e hora do Unix é o número de segundos desde 1º de janeiro de 1970, UTC, portanto é importante especificar o UTC.

date -d '1970-01-01 1357004952 sec UTC'
Mon Dec 31 17:49:12 PST 2012

Se você estiver em um Mac, use:

date -r 1357004952

Comando para obter época:

date +%s
1357004952

O crédito vai para Anton: BASH: converter carimbo de data e hora do Unix em uma data

dabest1
fonte
10

Como o @TomMcKenzie diz em um comentário para outra resposta, date -r 123456789é sem dúvida uma solução simples mais comum (ou seja, mais amplamente implementada) por tempos dados em segundos desde a época Unix, mas infelizmente não existe uma solução portátil universal garantida.

A -dopção em muitos tipos de sistemas significa algo completamente diferente da --dateextensão do GNU Date . Infelizmente, o GNU Date não interpreta -ro mesmo que essas outras implementações. Infelizmente, você precisa saber qual versão dateestá usando, e muitos datecomandos antigos do Unix não suportam nenhuma das opções.

Pior ainda, o POSIX datenão reconhece nem -dnem -rfornece nenhum caminho padrão em nenhum comando (que eu saiba) para formatar um horário do Unix a partir da linha de comando (já que o POSIX Awk também não possui strftime()). (Você não pode usar touch -te lsporque o primeiro não aceita um tempo dado em segundos desde a época do Unix.)

Observe que The One True Awk, disponível diretamente de Brian Kernighan, agora possui a strftime()função incorporada e também uma systime()função para retornar o tempo atual em segundos desde a época do Unix); portanto, talvez a solução Awk seja a mais portátil.

Greg A. Woods
fonte
4

Se você achar a notação estranha, talvez a -Ropção-ajude. Ele ultrapassa a data no formato RFC 2822. Então você não vai precisar de todos os identificadores: date -d @1278999698 -R. Outra possibilidade é a saída da data em segundos em sua localidade: date -d @1278999698 +%c. Deve ser fácil de lembrar. :-)

qbi
fonte
2

Ligeira correção para a resposta de dabest1 acima. Especifique o fuso horário como UTC, não GMT:

$ date -d '1970-01-01 1416275583 sec GMT'
Tue Nov 18 00:53:03 GMT 2014
$ date -d '1970-01-01 1416275583 sec UTC'
Tue Nov 18 01:53:03 GMT 2014

O segundo está correto. Penso que a razão é que, no Reino Unido, o horário de verão estava em vigor continuamente entre 1968 e 1971.

Tony Mountifield
fonte
2

A solução Perl padrão é:

echo $TIMESTAMP | perl -nE 'say scalar gmtime $_'

(ou hora local, se preferir)

William Pursell
fonte
1
awk 'BEGIN { print strftime("%c", 1271603087); }'
Sjoerd
fonte
1

Outros exemplos aqui são difíceis de lembrar. Na sua forma mais simples:

date -r 1305712800
denmojo
fonte
Resultados mistos: não funciona no ubuntu Linux, mas no Mac OS X, por exemplo.
Mike Q
1

Coloque o seguinte em seu ~ / .bashrc:

function unixts() { date -d "@$1"; }

Exemplo de uso:

$ unixts 1551276383

Wed Feb 27 14:06:23 GMT 2019
Dangelov
fonte
-1

Pitão:

python -c "from datetime import datetime; print(datetime.fromtimestamp($TIMESTAMP))"
Itachi
fonte