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).

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

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


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)


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

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.

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

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.


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

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>.


0

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


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.