Konvertieren Sie den Unix-Zeitstempel in eine Datumszeichenfolge

126

Gibt es eine schnelle, einzeilige Möglichkeit, einen Unix-Zeitstempel über die Unix-Befehlszeile in ein Datum zu konvertieren?

datekönnte funktionieren, außer es ist ziemlich umständlich, jedes Element (Monat, Tag, Jahr, Stunde usw.) anzugeben, und ich kann nicht herausfinden, wie es richtig funktioniert. Es scheint, als gäbe es einen einfacheren Weg - vermisse ich etwas?

Chimäre
quelle

Antworten:

179

Mit GNUs datekönnen Sie:

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

(Von: BASH: Unix-Zeitstempel in ein Datum konvertieren )

Unter OS X verwenden date -r.

date -r "$TIMESTAMP"

Alternativ verwenden strftime(). Es ist nicht direkt über die Shell verfügbar, aber Sie können über gawk darauf zugreifen . Der %cBezeichner zeigt den Zeitstempel in Abhängigkeit vom Gebietsschema an.

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
quelle
3
Stellen Sie sicher, dass Sie die Millisekunden aus dem Zeitstempel entfernen (das sind nur 10 statt 13 Ziffern), da Sie sonst ungültige Ergebnisse erhalten (dies gilt für das Datum von macOS).
Emerino
Ich dachte, das würde nicht funktionieren, bis mir klar wurde, dass ich einen Zeitstempel in Millis hatte. Hacken Sie die letzten 3 Ziffern ab und Sie erhalten die genaue Zeit
Stewart
64

date -d @1278999698 +'%Y-%m-%d %H:%M:%S' Wobei die Zahl dahinter @die Zahl in Sekunden ist

qbi
quelle
28
Unter OSX 10.8 ist es date -r 1278999698 +'%Y-%m-%d %H:%M:%S'(GMT) oder einfachdate -r 1278999698
Tom McKenzie
Funktioniert für Ubuntu 16.04
Mike Q
24

Diese Lösung funktioniert mit Datumsversionen, die nicht unterstützt werden date -d @. AWK oder andere Befehle sind nicht erforderlich . Ein Unix-Zeitstempel ist die Anzahl der Sekunden seit dem 1. Januar 1970 (UTC). Daher ist es wichtig, UTC anzugeben.

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

Wenn Sie einen Mac verwenden, verwenden Sie:

date -r 1357004952

Befehl zum Erhalten der Epoche:

date +%s
1357004952

Gutschrift geht an Anton: BASH: Unix-Zeitstempel in ein Datum konvertieren

dabest1
quelle
10

Wie @TomMcKenzie in einem Kommentar zu einer anderen Antwort sagt, date -r 123456789handelt es sich wohl um eine häufigere (dh weiter verbreitete) einfache Lösung für Zeiten, die seit der Unix-Epoche als Sekunden angegeben wurden, aber leider gibt es keine universell garantierte tragbare Lösung.

Die -dOption auf vielen Systemtypen bedeutet etwas völlig anderes als die --dateErweiterung von GNU Date . Leider interpretiert GNU Date nicht -rdasselbe wie diese anderen Implementierungen. Leider müssen Sie wissen, welche Version dateSie verwenden, und viele ältere Unix- dateBefehle unterstützen keine der beiden Optionen.

Schlimmer noch, POSIX dateerkennt weder -dnoch -rund bietet in keinem Befehl (den ich kenne) eine Standardmethode zum Formatieren einer Unix-Zeit über die Befehlszeile (da POSIX Awk ebenfalls fehlt strftime()). (Sie können nicht verwenden touch -tund lsweil erstere keine Zeit akzeptieren, die seit der Unix-Epoche als Sekunden angegeben wurde.)

Beachten Sie, dass The One True Awk, das direkt von Brian Kernighan erhältlich ist, jetzt über strftime()eine integrierte systime()Funktion sowie eine Funktion zum Zurückgeben der aktuellen Zeit in Sekunden seit der Unix-Epoche verfügt. Daher ist die Awk-Lösung möglicherweise die portabelste.

Greg A. Woods
quelle
4

Wenn Sie die Notation als unangenehm -Rempfinden, hilft möglicherweise die Option -option. Das Datum wird im RFC 2822-Format ausgegeben. Sie benötigen also nicht alle diese Kennungen : date -d @1278999698 -R. Eine andere Möglichkeit besteht darin, das Datum in Sekunden in Ihrem Gebietsschema auszugeben : date -d @1278999698 +%c. Sollte leicht zu merken sein. :-)

qbi
quelle
2

Leichte Korrektur der obigen Antwort von dabest1. Geben Sie die Zeitzone als UTC und nicht als GMT an:

$ 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

Der zweite ist richtig. Ich denke, der Grund dafür ist, dass in Großbritannien die Sommerzeit von 1968 bis 1971 kontinuierlich in Kraft war.

Tony Mountifield
quelle
2

Die Standard-Perl-Lösung lautet:

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

(oder Ortszeit, falls bevorzugt)

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

Andere Beispiele hier sind schwer zu merken. Im einfachsten Fall:

date -r 1305712800
denmojo
quelle
Gemischte Ergebnisse: Funktioniert nicht unter Ubuntu Linux, aber beispielsweise unter Mac OS X.
Mike Q
1

Geben Sie Folgendes in Ihr ~ / .bashrc ein:

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

Anwendungsbeispiel:

$ unixts 1551276383

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

Python:

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