it-swarm.com.de

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

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, folgende Ausgaben zu erhalten:

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

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 Core Tools (dafür 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 mit beiden das -u (Standard) Option oder übergeben Sie ein TZ=UTC0 Umgebungsvariable mit dem UTC-Datum (TZ=UTC0definiert eine Zeitzone namens UTC mit Offset 0 von UTC, während das Verhalten für TZ=UTC (ohne Offset) ist nicht spezifiziert (obwohl sich auf den meisten Systemen auf eine systemdefinierte Zeitzone beziehen würde, die auch als UTC mit Offset 0 von UTC bezeichnet wird)).

98
user601

Dieser Perl Einzeiler wird es tun:

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

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

$ date --date "Jan 1, 1970 00:00:00 +0000 + 1282367908 seconds"
Sat Aug 21 09:18:28 MSD 2010
6
AlexD

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 %c Durch das gewünschte Format strftime().

5

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

epochtorfc3339 ()
{
    RFC3339_FORMAT="+%FT%T:::%z"
    Epoch=$(echo [email protected] | 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
}
2
Noah Spurrier

Auf osx in UTC zu haben

date -r "1475737200" -u
2
anyone

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

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

(Übrigens scheint Ihr Beispiel um eine Sekunde verschoben zu sein)

1
codehead