it-swarm.it

Come posso convertire un timestamp Epoch in un formato leggibile dall'uomo sul cli?

Come posso convertire un timestamp Epoch in un formato leggibile dall'uomo sul cli? Penso che ci sia un modo per farlo con la data, ma la sintassi mi sfugge (altri modi benvenuti).

196
xenoterracide

Su * BSD:

date -r 1234567890

Su Linux (in particolare, con GNU coreutils ≥5.3):

date -d @1234567890

Con le versioni precedenti di GNU, è possibile calcolare la differenza relativa rispetto all'epoca UTC:

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

Se hai bisogno di portabilità, sei sfortunato. L'unica volta che è possibile formattare con una riga del comando POSIX Shell (senza eseguire il calcolo da soli) è l'ora corrente. In pratica, Perl è spesso disponibile:

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

date -d @1190000000 Sostituisci 1190000000 con la tua epoca

28
fschmitt
$ echo 1190000000 | Perl -pe 's/(\d+)/localtime($1)/e' 
Sun Sep 16 20:33:20 2007

Questo può tornare utile per quelle applicazioni che usano il tempo Epoch nei file di registro:

$ 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
Stefan Lasiewski

Formato personalizzato con GNU date:

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

O con GNU awk:

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

Linked SO domanda: https://stackoverflow.com/questions/3249827/convert-from-unixtime-at-command-line

12
Ivan Chau

Se il tempo Epoch è in millisecondi anziché in secondi, rimuovi le ultime tre cifre prima di passarlo a date -d:

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

Questo fornisce dati errati. Rimuovi le ultime tre cifre.

$ 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

Con bash-4.2 O superiore:

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

(dove %F %T è il formato di tipo strftime())

Tale sintassi è ispirata da ksh93.

In ksh93, Tuttavia, l'argomento viene preso come espressione di data in cui sono supportati vari formati difficilmente documentati.

Per un tempo di epoca Unix, la sintassi in ksh93 È:

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

ksh93 Tuttavia sembra utilizzare il proprio algoritmo per il fuso orario e può sbagliare. Ad esempio, in Gran Bretagna, nel 1970 era estate tutto l'anno, ma:

$ 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

I due che utilizzo frequentemente sono:

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

e

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

Con zsh puoi usare strftime builtin:

strftime formato epochtime
 
 Stampa la data indicata da epochtime nel formato specificato.

per esempio.

zmodload zsh/datetime
strftime '%A, %d %b %Y' 1234567890
Venerdì 13 febbraio 2009

C'è anche dateconv da dateutils :

dateconv -i '%s' -f '%A, %d %b %Y' 1234567890
Venerdì 13 febbraio 2009

tieni a mente dateutils tools predefinito su UTC (aggiungi -z your/timezone se necessario).

7
don_crissti

È inoltre possibile utilizzare un piccolo programma C per stampare il datetime nel formato che può essere analizzato direttamente da Shell

#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;
}

utilizzo:

#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

Non sarebbe una vera soluzione senza un piccolo node.js:

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

aggiungilo a ~/.bash_aliases e assicurati che provenga da ~/.bashrc con . ~/.bash_aliases

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

Per ottenere il nodo sul tuo sistema vai a http://nvm.sh ed esegui il comando curl. Installa il gestore versione nodo (nvm) che ti consente di cambiare versione del nodo.

Digita nvm ls-remote e scegli una versione per nvm install <version>.

0
chovy

In PowerShell :

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