Wie kann ich ein formatiertes Datum für einen UNIX-Zeitstempel über die Befehlszeile abrufen?

59

Ich habe einen UNIX-Zeitstempel und möchte ein formatiertes Datum (wie die Ausgabe von date) erhalten, das diesem Zeitstempel entspricht.

Meine bisherigen Versuche:

$ 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'

Ich möchte in der Lage sein, eine Ausgabe wie folgt zu erhalten:

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

Antworten:

91

Unter Mac OS X und BSD:

$ date -r 1282368345
Sat Aug 21 07:25:45 CEST 2010
$ date -r 1282368345 +%Y-%m-%d
2010-08-21

mit GNU-Kernwerkzeugen (dazu muss man die Info-Datei durchforsten):

$ date -d @1282368345
Sat Aug 21 07:25:45 CEST 2010
$ date -d @1282368345 --rfc-3339=date
2010-08-21

Fügen Sie entweder die -uOption (Standard) hinzu oder übergeben Sie eine TZ=UTC0Umgebungsvariable, um das UTC-Datum zu erhalten ( TZ=UTC0 definiert eine Zeitzone, die UTCmit dem Versatz 0 von UTC aufgerufen wird, während das Verhalten für TZ=UTC(ohne Versatz) nicht spezifiziert ist (obwohl sich die meisten Systeme auf a beziehen würden) Systemdefinierte Zeitzone, die auch UTCmit dem Offset 0 von UTC)) aufgerufen wird .

Stéphane Chazelas
quelle
1
Es erfordert jedoch viel Graben, was für eine so häufige Aufgabe überraschend ist.
David Z
Danke, habe deine Antwort angenommen. Ich hätte info coreutils dateetwas genauer lesen sollen .
Umang
Dies gibt mir ein etwas anderes Datum: date -r 1447264553943ergibt Wed Dec 28 01:39:03 BRST 47831, wann es tatsächlich ist 11/11/2015, 3:55:53 PM GMT-2:00.
Falmp
1
@falmp: Es funktioniert, wenn Sie Sekunden anstelle von Mikrosekunden verwenden.
@hop ops, hätte mit 47831 rechnen sollen, aber diese Zahl war so hoch, dass ich sie verpasst habe. Vielen Dank!
Falmp
6

Nach einigem googeln habe ich einen Weg gefunden, dies nur mit dem dateBefehl zu tun :

$ date --date "Jan 1, 1970 00:00:00 +0000 + 1282367908 seconds"
Sat Aug 21 09:18:28 MSD 2010
AlexD
quelle
Dank dafür. Ich hatte gehofft, dass es etwas Einfacheres geben würde, also nur eine Abstimmung.
Umang
ein weiteres gutes Beispiel dafür, wie dumm Sie Google macht. liest niemand mehr die dokumentation?
1
@hop, support for date -d @xxxwurde erst 2005 mit coreutils 5.3 hinzugefügt. So mussten Sie das vorher machen.
Stéphane Chazelas
@ StéphaneChazelas: a) diese Antwort stammt aus dem Jahr 2010 und b) warum googelt diese Entschuldigung vor dem Lesen der Dokumentation? Wenn Sie von sich aus antworten, kann man solche Fehler entschuldigen, aber wenn Sie es trotzdem nachschlagen müssen, suchen Sie es richtig nach.
@hop, ich habe nur darauf hingewiesen, dass es keine blöde Antwort war, nur eine veraltete.
Stéphane Chazelas
6

Dieser Perl-Einzeiler macht es:

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

Mit Shell Builtins:

  • zsh (4.1.1 (2003) und höher):

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

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

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

Ersetzen Sie in all diesen Fällen %cdas strftime()gewünschte Format.

Stéphane Chazelas
quelle
Haben Sie eine Referenz für die bash printfLösung?
Derek Mahar
Aber egal , ich habe es in der Beschreibung von printfin gnu.org/software/bash/manual/bashref.html#Bash-Builtins gefunden .
Derek Mahar
2

Auf osx in UTC zu haben

date -r "1475737200" -u
jemand
quelle
Vielen Dank. Ich habe das in der akzeptierten Antwort bearbeitet, damit die Informationen leichter verfügbar sind.
Stéphane Chazelas
1

Ein weiteres gutes Beispiel für das reiche Erbe des modernen Unix. Dies ist in der Tat unter den meisten BSD-Varianten möglich:

$ TZ=UTC date -r 1282368345
Sat Aug 21 05:25:45 UTC 2010

(BTW Ihr Beispiel scheint um eine Sekunde aus zu sein)

Codehead
quelle
Funktioniert nicht unter Linux. Hops Antwort scheint die richtige Linux-Antwort zu haben. Vielen Dank, dass Sie darauf hingewiesen haben. Ich hatte den Verdacht, dass so etwas passieren würde. Ich habe es jetzt in 45 Sekunden geschafft.
Umang
1

Beantworten Sie eine alte Frage, aber ich denke, dass dies eine Verbesserung sein könnte, wenn jemand anderes danach sucht. Diese Bash-Funktion funktioniert sowohl unter Linux als auch unter OS X. Ich habe sie auf keinem anderen BSD-System getestet. Übergeben Sie die Epochenzeit als Argument für diese Funktion und es wird das RFC-3339-Zeitformat gedruckt.

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
quelle