it-swarm.com.de

Wie konvertiere ich einen Epochen-Zeitstempel in ein von Menschen lesbares Format auf dem CLI?

Wie konvertiere ich einen Epochen-Zeitstempel in ein von 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).

196
xenoterracide

Ein * BSD:

date -r 1234567890

Unter Linux (speziell mit GNU coreutils ≥5.3):

date -d @1234567890

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

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

Wenn Sie Portabilität benötigen, haben Sie kein Glück. Das einzige Mal, dass Sie mit einer POSIX Shell-Befehlszeile formatieren können (ohne die Berechnung selbst durchzuführen), ist die aktuelle Zeit. In der Praxis ist Perl häufig verfügbar:

Perl -le 'print scalar localtime $ARGV[0]' 1234567890

date -d @1190000000 Ersetzen Sie 1190000000 durch Ihre Epoche

28
fschmitt
$ 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 die Epochenzeit in den Protokolldateien 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)
14

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üpft SO Frage: https://stackoverflow.com/questions/3249827/convert-from-unixtime-at-command-line

12
Ivan Chau

Wenn Ihre Epochenzeit in Millisekunden statt in Sekunden angegeben ist, entfernen Sie die letzten drei Ziffern, bevor Sie sie an date -d Übergeben:

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

Dies ergibt 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.
12
KnockTurnAl

Mit bash-4.2 Oder höher:

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

(wobei %F %T das Format vom Typ strftime() ist)

Diese Syntax ist von ksh93 Inspiriert.

In ksh93 Wird das Argument jedoch als Datumsausdruck verwendet, bei dem verschiedene und kaum dokumentierte Formate unterstützt werden.

Für eine Unix-Epoche lautet die Syntax in ksh93:

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

ksh93 Scheint jedoch einen eigenen Algorithmus für die Zeitzone zu verwenden und kann etwas falsch machen. In Großbritannien war es 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
11

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

Mit zsh können Sie das eingebaute strftime verwenden:

strftime format Epochtime
 
 Geben Sie das mit epoche in dem format spezifizierten.

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 dateutils tools standardmäßig UTC ist (fügen Sie -z your/timezone wenn benötigt).

7
don_crissti

Sie können auch ein kleines C-Programm verwenden, um die Datums- und Uhrzeitangabe in dem Format zu drucken, das von Shell direkt 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
Meow

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

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

füge das zu ~/.bash_aliases hinzu und stelle sicher, dass es in ~/.bashrc mit . ~/.bash_aliases bezogen ist.

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

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

Geben Sie einfach nvm ls-remote Ein und wählen Sie eine Version für nvm install <version>.

0
chovy

In PowerShell :

(([System.DateTimeOffset]::FromUnixTimeMilliSeconds($unixtime)).DateTime).ToString("s")
0
Kulwinder Singh