2010-07-14 15 views
79

Esiste un modo rapido e unilaterale per convertire un timestamp Unix in una data dalla riga di comando Unix?Conversione da ora Unix alla riga di comando

'Data' potrebbe funzionare, eccetto che è piuttosto scomodo specificare ogni elemento (mese, giorno, anno, ora, ecc.) E non riesco a capire come farlo funzionare correttamente. Sembra che ci potrebbe essere un modo più semplice - mi manca qualcosa?

+2

Quale shell stai usando? Bash? Zsh? Dash? –

+0

Bash - dimenticato di menzionare! – chimeracoder

+1

possibile duplicato di [Come convertire i timestamp in date in bash?] (Http://stackoverflow.com/questions/2371248/how-to-convert-timestamps-to-dates-in-bash) – user

risposta

106

con GNU di date si può fare:

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

(Da: BASH: Convert Unix Timestamp to a Date)

Su OS X, utilizzare date -r.

date -r "$TIMESTAMP" 

In alternativa, utilizzare strftime(). Non è disponibile direttamente dalla shell, ma è possibile accedervi tramite gawk. L'identificatore %c visualizza il timestamp in modo dipendente dalla locale.

echo "$TIMESTAMP" | gawk '{print strftime("%c", $0)}' 
# echo 0 | gawk '{print strftime("%c", $0)}' 
Wed 31 Dec 1969 07:00:00 PM EST 
1
awk 'BEGIN { print strftime("%c", 1271603087); }' 
49

date -d @1278999698 +'%Y-%m-%d %H:%M:%S' Qualora il numero dietro @ è è il numero di secondi

+26

Su OSX 10.8, è 'data -r 1278999698 + '% Y-% m-% d% H:% M:% S'' (GMT) o semplicemente' date -r 1278999698' –

4

Se si trova la notazione imbarazzante, forse il -opzione -R aiuta. Trasmette la data nel formato RFC 2822. Quindi non avrai bisogno di tutti quegli identificatori: date -d @1278999698 -R. Un'altra possibilità è di mostrare la data in secondi nella tua lingua: date -d @1278999698 +%c. Dovrebbe essere facile da ricordare. :-)

2

La soluzione standard Perl è:

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

(o localtime, se si preferisce)

18

Questa soluzione funziona con le versioni di data che non supportano date -d @. Non richiede AWK o altri comandi. Un timestamp Unix è il numero di secondi dal 1 ° gennaio 1970, UTC quindi è importante specificare UTC.

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

Se siete su un Mac, quindi utilizzare:

date -r 1357004952 

Comando per ottenere epoca:

date +%s 
1357004952 

merito va a Anton: BASH: Convert Unix Timestamp to a Date

9

Come @ TomMcKenzie dice in un commento ad un'altra risposta, date -r 123456789 è probabilmente più comune (es. più ampiamente implementata) soluzione semplice per i tempi forniti come secondi da Unix Epoch, ma sfortunatamente non esiste una soluzione portatile universale garantita.

L'opzione -d su molti tipi di sistemi indica qualcosa di completamente diverso dall'estensione di GNU Date --date. Purtroppo GNU Date non interpreta lo -r come le altre implementazioni. Quindi sfortunatamente devi sapere quale versione di date stai usando, e molti vecchi comandi di Unix date non supportano nessuna delle due opzioni.

Ancora peggio, POSIX date riconosce né -d-r e fornisce un modo standard in qualsiasi comando a tutti (che io sappia) per formattare un tempo di Unix da linea di comando (in quanto POSIX Awk manca anche strftime()). (Non è possibile utilizzare touch -t e ls perché il primo non accetta un tempo dato come secondi dalla Unix Epoch.)

Nota se L'Unico Vero Awk disponibile direttamente da Brian Kernighan non hanno ora la funzione built-in strftime() così come una funzione systime() per restituire l'ora corrente in secondi da Unix Epoch), quindi forse la soluzione Awk è la più portabile.

1

Leggera correzione alla risposta di dabest1 sopra. Specificare il fuso orario come UTC, non 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 

Il secondo è corretto. Penso che la ragione è che nel Regno Unito, l'ora legale era in vigore continuamente dal 1968 al 1971.

+0

Grazie, ho aggiornato la mia risposta. – dabest1

2

Altri esempi qui sono difficili da ricordare. Nella sua forma più semplice:

date -r 1305712800 
Problemi correlati