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 datenon ha fatto riferimento a questo ...
info dateè abbastanza completo. La voce su 28.9 Seconds since the Epochspiega 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.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
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 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).
È 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_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>.
C'è un modo più semplice per farlo: ((([System.DateTimeOffset] :: FromUnixTimeMilliSeconds ($ unixtime)). DateTime) .ToString ("s")