Converte il timestamp Unix in una stringa di data


128

Esiste un modo rapido e di una riga per convertire un timestamp Unix in una data dalla riga di comando Unix?

datepotrebbe funzionare, tranne per il fatto che è piuttosto scomodo specificare ogni elemento (mese, giorno, anno, ora, ecc.) e non riesco a capire come farlo funzionare correttamente. Sembra che ci possa essere un modo più semplice: mi sto perdendo qualcosa?


Risposte:


181

Con GNU datepuoi fare:

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

(Da: BASH: converti il ​​timestamp Unix in una data )

Su OS X, usa date -r.

date -r "$TIMESTAMP"

In alternativa, usa strftime(). Non è disponibile direttamente dalla shell, ma puoi accedervi tramite gawk . Lo %cspecificatore 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

3
Assicurati di eliminare i millisecondi dal timestamp (che è solo 10 cifre invece di 13), altrimenti otterrai risultati non validi (questo è vero per la data di macOS).
emerino

Ho pensato che non funzionasse, finché non ho capito di avere un timestamp in millisecondi. Taglia le ultime 3 cifre e ottieni l'ora esatta
Stewart

64

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


28
Su OSX 10.8, è date -r 1278999698 +'%Y-%m-%d %H:%M:%S'(GMT) o semplicementedate -r 1278999698
Tom McKenzie

Funziona per Ubuntu 16.04
Mike Q

24

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 sei su un Mac, usa:

date -r 1357004952

Comando per ottenere epoca:

date +%s
1357004952

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


10

Come dice @TomMcKenzie in un commento a un'altra risposta, date -r 123456789è probabilmente una soluzione semplice più comune (cioè più ampiamente implementata) per i tempi indicati come secondi dall'epoca di Unix, ma sfortunatamente non esiste una soluzione portatile universale garantita.

L' -dopzione su molti tipi di sistemi significa qualcosa di completamente diverso --datedall'estensione di GNU Date . Purtroppo GNU Date non interpreta -rlo stesso di queste altre implementazioni. Quindi sfortunatamente devi sapere quale versione datestai usando e molti vecchi datecomandi Unix non supportano nessuna delle due opzioni.

Ancora peggio, POSIX datenon riconosce né -d-re non fornisce alcun modo standard in alcun comando (che io sappia) per formattare un'ora Unix dalla riga di comando (poiché anche POSIX Awk manca strftime()). (Non puoi usare touch -te lsperché il primo non accetta un tempo dato come secondi dall'Epoch di Unix.)

Nota anche se The One True Awk disponibile direttamente da Brian Kernighan ora ha la strftime()funzione integrata e una systime()funzione per restituire l'ora corrente in secondi dall'Epoch di Unix), quindi forse la soluzione Awk è la più portabile.


4

Se trovi la notazione scomoda, forse l' -Ropzione-ti aiuta. Emette la data nel formato RFC 2822. Così non sarà necessario tutte quelle identificatori: date -d @1278999698 -R. Un'altra possibilità è quella di uscita dalla data in secondi nel vostro locale: date -d @1278999698 +%c. Dovrebbe essere facile da ricordare. :-)


2

Leggera correzione alla risposta di dabest1 sopra. Specifica 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 il motivo sia che nel Regno Unito, l'ora legale era in vigore ininterrottamente dal 1968 al 1971.


2

La soluzione standard Perl è:

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

(o ora locale, se si preferisce)


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

1

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

date -r 1305712800

Risultati contrastanti: non funziona in Ubuntu Linux, ma ad esempio in Mac OS X.
Mike Q

1

Metti quanto segue nel tuo ~ / .bashrc:

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

Utilizzo di esempio:

$ unixts 1551276383

Wed Feb 27 14:06:23 GMT 2019

-1

Pitone:

python -c "from datetime import datetime; print(datetime.fromtimestamp($TIMESTAMP))"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.