Wie konvertiere ich einen Zeitstempel einer Epoche in ein für Menschen lesbares Format auf dem CLI?

183

Wie konvertiere ich einen Zeitstempel einer Epoche in ein für Menschen lesbares Format auf dem CLI? Ich denke, es gibt eine Möglichkeit, dies mit Datum zu tun, aber die Syntax entzieht sich mir (andere Möglichkeiten sind willkommen).

Xenoterracid
quelle

Antworten:

268

Ein * BSD:

date -r 1234567890

Unter Linux (speziell mit GNU-Coreutils ≥5.3):

date -d @1234567890

Mit älteren Versionen von GNU date können Sie die relative Differenz zur UTC-Epoche berechnen:

date -d '1970-01-01 UTC + 1234567890 seconds'

Wenn Sie Portabilität brauchen, haben Sie Pech. Die einzige Zeit, die Sie mit einem POSIX-Shell-Befehl (ohne die Berechnung selbst durchzuführen) formatieren können, ist die aktuelle Zeit. In der Praxis ist Perl häufig verfügbar:

perl -le 'print scalar localtime $ARGV[0]' 1234567890
Gilles
quelle
4
+1 für den Kommentar über die mangelnde Portabilität (warum nicht die POSIX-Spezifikation eine Möglichkeit, dies zu tun? Grr)
Richard Hansen
3
Was bedeutet das @in date -d @1234567890? man datemachte keinen Hinweis darauf ...
Chris Markle
10
@ ChrisMarkle GNU-Manpages sind oft absolut unvollständig. „Das Datum String - Format ist komplexer als leicht hier dokumentiert , ist aber voll in der Info - Dokumentation beschrieben.“ Nämlich: gnu.org/software/coreutils/manual/html_node/...
Gilles
2
Das info dateist ganz komplett. Der Eintrag unter 28.9 Seconds since the Epocherklärt ausführlich den @timestamp.
In Linux in einer Pipe: Datum + '% s' | xargs -I n date -d @n
Ivan Ogai
26

date -d @1190000000 Ersetzen Sie 1190000000 durch Ihre Epoche

fschmitt
quelle
8
Vorausgesetzt, das GNU-Datum.
Gilles
14
$ echo 1190000000 | perl -pe 's/(\d+)/localtime($1)/e' 
Sun Sep 16 20:33:20 2007

Dies kann für Anwendungen nützlich sein, die in den Protokolldateien die Epochenzeit verwenden:

$ tail -f /var/log/nagios/nagios.log | perl -pe 's/(\d+)/localtime($1)/e'
[Thu May 13 10:15:46 2010] EXTERNAL COMMAND: PROCESS_SERVICE_CHECK_RESULT;HOSTA;check_raid;0;check_raid.pl: OK (Unit 0 on Controller 0 is OK)
Stefan Lasiewski
quelle
11

Benutzerdefiniertes Format mit GNU date:

date -d @1234567890 +'%Y-%m-%d %H:%M:%S'

Oder mit GNU awk:

awk 'BEGIN { print strftime("%Y-%m-%d %H:%M:%S", 1234567890); }'

Verknüpfte SO-Frage: https://stackoverflow.com/questions/3249827/convert-from-unixtime-at-command-line

Ivan Chau
quelle
3
Funktioniert nur für GNU date und GNU awk. Weder awk noch nawk unterstützen Strftime.
DarkHeart
11

Mit bash-4.2oder über:

printf '%(%F %T)T\n' 1234567890

(wo %F %Tist das strftime()-type Format)

Diese Syntax ist inspiriert von ksh93.

In ksh93jedoch wird das Argument als Datum Ausdruck gebracht , wo verschiedene und kaum dokumentiert Formate unterstützt werden.

Für eine Unix-Epoche ksh93lautet die Syntax in :

printf '%(%F %T)T\n' '#1234567890'

ksh93scheint jedoch einen eigenen Algorithmus für die Zeitzone zu verwenden und kann es falsch machen. In Großbritannien war beispielsweise 1970 das ganze Jahr über Sommer, aber:

$ TZ=Europe/London bash -c 'printf "%(%c)T\n" 0'
Thu 01 Jan 1970 01:00:00 BST
$ TZ=Europe/London ksh93 -c 'printf "%(%c)T\n" "#0"'
Thu Jan  1 00:00:00 1970
Stéphane Chazelas
quelle
7

Wenn Ihre Epochenzeit nicht in Sekunden, sondern in Millisekunden angegeben ist, entfernen Sie die letzten drei Ziffern, bevor Sie sie an date -dfolgende Adresse übergeben :

$ date -d @1455086371603
Tue Nov  7 02:46:43 PST 48079     #Incorrect

Dies gibt falsche Daten. Entfernen Sie die letzten drei Ziffern.

$ date -d @1455086371
Tue Feb  9 22:39:31 PST 2016      #Correct after removing the last three digits. You may remove and round off the last digit too.
KnockTurnAl
quelle
Welche Utility-Ausdrucke enthalten Millisekunden (ohne Punkt)?
Ich habe gesehen, dass der WebLogic-Anwendungsserver bei Verwendung des Skript-Tools hauptsächlich Datenzeitwerte mit Millisekunden und ohne Punkte zurückgibt. zB lastSuccessfulConnectionUse = 1455086371603
KnockTurnAl
Aha. Diese Seite bestätigt den Rohzeitwert. Der Zeitstempel in Millisekunden . Vielen Dank.
Atlassian-Tools protokollieren ihre Zeitstempel als Epochenzeit in Millisekunden.
Br.Bill
6

Die zwei, die ich häufig benutze, sind:

$ perl -leprint\ scalar\ localtime\ 1234567890
Sat Feb 14 00:31:30 2009

und

$ tclsh
% clock format 1234567890
Sa Feb 14 00:31:30 CET 2009
al.
quelle
6

Mit zshkönnten Sie das strftimeeingebaute benutzen:

strftime format epochtime
Geben Sie das 
      durch die Epochenzeit angegebene Datum im angegebenen Format aus .

z.B

zmodload zsh/datetime
strftime '%A, %d %b %Y' 1234567890
Freitag, 13. Februar 2009

Es gibt auch dateconvvon dateutils:

dateconv -i '%s' -f '%A, %d %b %Y' 1234567890
Freitag, 13. Februar 2009

Beachten Sie, dass die dateutilsWerkzeuge standardmäßig UTC( -z your/timezonebei Bedarf hinzufügen ) sind.

don_crissti
quelle
0

Sie können auch ein kleines C-Programm zum Drucken der Datums- und Uhrzeitangabe in dem Format verwenden, das direkt von der Shell analysiert werden kann

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

int main(int argc, char * argv[]) {

    if (argc==1) { 
        return 1;
    }

    struct tm input_tm;
    char * formatStr  = "YEAR=%Y\nMON=%m\nDAY=%d\nHOUR=%H\nMIN=%M\nSEC=%S";
    size_t formatSize = strlen(formatStr) + 2;
    char * output     = (char *)malloc(sizeof(char)*formatSize);

    strptime(argv[1],"%s",&input_tm);
    strftime(output, formatSize, formatStr, &input_tm);

    printf("%s\n",output);
    free(output);
    return 0;
}

Verwendungszweck:

#compile
clang -o epoch2datetime main.c

#invoke
eval `./epoch2datetime 1450196411`
echo $YEAR $MON $DAY $HOUR $MIN $SEC
#output
#2015 12 16 00 20 11
Miau
quelle
0

Wäre keine echte Lösung ohne ein wenig node.js:

epoch2date(){
    node -p "new Date($1)"
}

fügen Sie das hinzu ~/.bash_aliasesund stellen Sie sicher, dass es ~/.bashrcmit bezogen wird. ~/.bash_aliases

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi

Um den Knoten auf Ihrem System zu installieren, rufen Sie http://nvm.sh auf und führen Sie den Befehl curl aus. Hiermit wird der Node Version Manager (nvm) installiert, mit dem Sie die Versionen von Node wechseln können.

Geben Sie einfach nvm ls-remoteeine Version ein und wählen Sie diese aus nvm install <version>.

chovy
quelle
0

Es gibt einen einfacheren Weg, dies zu tun: (([System.DateTimeOffset] :: FromUnixTimeMilliSeconds ($ unixtime)). DateTime) .ToString ("s")

Kulwinder Singh
quelle
Willkommen bei U & L! Schauen Sie sich bitte die Tags der Frage an: Funktioniert dieser Code in einer Shell auf einem Unix- oder Unix-ähnlichen System?
Fra-San
Diese Technik verwendet Microsoft .NET. Es scheint nicht, dass OP nach einer MS-Lösung sucht.
user2320464