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


183

Come posso convertire un timestamp di epoca 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).

Risposte:


268

Su * BSD:

date -r 1234567890

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

date -d @1234567890

Con le versioni precedenti della data 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 di 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

4
+1 per il commento sulla mancanza di portabilità (perché le specifiche POSIX non includono un modo per farlo? Grr)
Richard Hansen

3
Cosa @significa date -d @1234567890? man datenon ha fatto riferimento a questo ...
Chris Markle il

10
Le pagine man di @ChrisMarkle GNU sono spesso terribilmente incomplete. "Il formato della stringa di data è più complesso di quanto sia facilmente documentabile qui, ma è completamente descritto nella documentazione informativa
Gilles

2
Il info dateè abbastanza completo. La voce su 28.9 Seconds since the Epochspiega in dettaglio su @timestamp.

In Linux in una pipe: date + '% s' | xargs -I n date -d @n
Ivan Ogai

26

date -d @1190000000 Sostituisci 1190000000 con la tua epoca


8
Supponendo la data GNU, cioè.
Gilles,

14
$ 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 di epoca 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)


11

Con bash-4.2o sopra:

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

(dov'è %F %Til strftime()formato di tipo)

Questa sintassi è ispirata ksh93.

Nel ksh93tuttavia, l'argomento è preso come espressione data in cui sono supportati vari formati e difficilmente documentati.

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

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

ksh93tuttavia 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

7

Se il tempo è 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.

Quali stampe di utilità includevano millisecondi (senza punto)?

Ho visto che il server delle applicazioni WebLogic restituisce principalmente valori di tempo dei dati con millisecondi e senza punti quando si utilizza lo strumento di scripting. ad es. lastSuccessfulConnectionUse = 1455086371603
KnockTurnAl

Vedo. Questa pagina conferma il valore del tempo grezzo Il timestamp in millisecondi . Grazie.

Gli strumenti Atlassian registrano i loro timestamp come tempo di epoca con millisecondi.
Br.Bill

6

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

6

Con zshte puoi usare il strftimebuiltin:

strftime epochtime formato
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 dateconvda dateutils:

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

tieni a mente gli dateutilsstrumenti di default UTC(aggiungi -z your/timezonese necessario).


0

È inoltre possibile utilizzare un piccolo programma C per stampare il datetime nel formato che può essere analizzato direttamente dalla 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

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

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

aggiungere che per ~/.bash_aliasese assicurarsi che la sua origine in ~/.bashrccon. ~/.bash_aliases

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

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

Basta digitare nvm ls-remotee scegliere una versione per nvm install <version>.


0

C'è un modo più semplice per farlo: ((([System.DateTimeOffset] :: FromUnixTimeMilliSeconds ($ unixtime)). DateTime) .ToString ("s")


Benvenuto in U&L! Per favore, dai un'occhiata ai tag della domanda: questo codice funziona in una shell su un sistema simile a Unix o Unix?
fra-san,

Questa tecnica utilizza Microsoft .NET. Non sembra che OP stia cercando una soluzione per la SM.
user2320464
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.