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).
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:
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
@
significa date -d @1234567890
? man date
non ha fatto riferimento a questo ...
info date
è abbastanza completo. La voce su 28.9 Seconds since the Epoch
spiega in dettaglio su @timestamp.
$ 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)
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); }'
Domanda SO collegata: https://stackoverflow.com/questions/3249827/convert-from-unixtime-at-command-line
Con bash-4.2
o sopra:
printf '%(%F %T)T\n' 1234567890
(dov'è %F %T
il strftime()
formato di tipo)
Questa sintassi è ispirata ksh93
.
Nel ksh93
tuttavia, 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'
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
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.
Con zsh
te puoi usare il strftime
builtin:
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 dateconv
da dateutils
:
dateconv -i '%s' -f '%A, %d %b %Y' 1234567890
Venerdì 13 febbraio 2009
tieni a mente gli dateutils
strumenti di default UTC
(aggiungi -z your/timezone
se necessario).
È 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
Non sarebbe una vera soluzione senza un piccolo node.js:
epoch2date(){
node -p "new Date($1)"
}
aggiungere che per ~/.bash_aliases
e assicurarsi che la sua origine in ~/.bashrc
con. ~/.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-remote
e scegliere una versione per nvm install <version>
.
C'è un modo più semplice per farlo: ((([System.DateTimeOffset] :: FromUnixTimeMilliSeconds ($ unixtime)). DateTime) .ToString ("s")