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 datemachte keinen Hinweis darauf ...
info dateist ganz komplett. Der Eintrag unter 28.9 Seconds since the Epocherklä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.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
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.
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.
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_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>.
Es gibt einen einfacheren Weg, dies zu tun: (([System.DateTimeOffset] :: FromUnixTimeMilliSeconds ($ unixtime)). DateTime) .ToString ("s")