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).
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:
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
@
in date -d @1234567890
? man date
machte keinen Hinweis darauf ...
info date
ist ganz komplett. Der Eintrag unter 28.9 Seconds since the Epoch
erklärt ausführlich den @timestamp.
$ 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)
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
Mit bash-4.2
oder über:
printf '%(%F %T)T\n' 1234567890
(wo %F %T
ist das strftime()
-type Format)
Diese Syntax ist inspiriert von ksh93
.
In ksh93
jedoch wird das Argument als Datum Ausdruck gebracht , wo verschiedene und kaum dokumentiert Formate unterstützt werden.
Für eine Unix-Epoche ksh93
lautet die Syntax in :
printf '%(%F %T)T\n' '#1234567890'
ksh93
scheint 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
Wenn Ihre Epochenzeit nicht in Sekunden, sondern in Millisekunden angegeben ist, entfernen Sie die letzten drei Ziffern, bevor Sie sie an date -d
folgende 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.
Mit zsh
könnten Sie das strftime
eingebaute 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 dateconv
von dateutils
:
dateconv -i '%s' -f '%A, %d %b %Y' 1234567890
Freitag, 13. Februar 2009
Beachten Sie, dass die dateutils
Werkzeuge standardmäßig UTC
( -z your/timezone
bei Bedarf hinzufügen ) sind.
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
Wäre keine echte Lösung ohne ein wenig node.js:
epoch2date(){
node -p "new Date($1)"
}
fügen Sie das hinzu ~/.bash_aliases
und stellen Sie sicher, dass es ~/.bashrc
mit 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-remote
eine Version ein und wählen Sie diese aus nvm install <version>
.
Es gibt einen einfacheren Weg, dies zu tun: (([System.DateTimeOffset] :: FromUnixTimeMilliSeconds ($ unixtime)). DateTime) .ToString ("s")