¿Cómo convierto una marca de tiempo de Epoch a un formato legible para humanos en el cli? Creo que hay una manera de hacerlo con la fecha, pero la sintaxis me elude (otras formas son bienvenidas).
En * BSD:
date -r 1234567890
En Linux (específicamente, con GNU coreutils ≥5.3):
date -d @1234567890
Con versiones anteriores de GNU fecha, puede calcular la diferencia relativa a la Época UTC:
date -d '1970-01-01 UTC + 1234567890 seconds'
Si necesita portabilidad, no tiene suerte. La única vez que puede formatear con un comando POSIX Shell (sin hacer el cálculo usted mismo) es la hora actual. En la práctica, Perl a menudo está disponible:
Perl -le 'print scalar localtime $ARGV[0]' 1234567890
date -d @1190000000
Reemplace 1190000000 con su época
$ echo 1190000000 | Perl -pe 's/(\d+)/localtime($1)/e'
Sun Sep 16 20:33:20 2007
Esto puede ser útil para aquellas aplicaciones que usan el tiempo de Epoch en los archivos de 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 personalizado 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); }'
Vinculado SO pregunta: https://stackoverflow.com/questions/3249827/convert-from-unixtime-at-command-line
Si su tiempo de Época es en milisegundos en lugar de segundos, elimine los últimos tres dígitos antes de pasarlo a date -d
:
$ date -d @1455086371603
Tue Nov 7 02:46:43 PST 48079 #Incorrect
Esto da datos incorrectos. Elimina los últimos tres dígitos.
$ 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 bash-4.2
O superior:
printf '%(%F %T)T\n' 1234567890
(donde %F %T
es el formato de tipo strftime()
-)
Esa sintaxis está inspirada en ksh93
.
Sin embargo, en ksh93
, El argumento se toma como una expresión de fecha en la que se admiten diversos formatos y apenas documentados.
Para una época de Unix Epoch, la sintaxis en ksh93
Es:
printf '%(%F %T)T\n' '#1234567890'
ksh93
Sin embargo parece usar su propio algoritmo para la zona horaria y puede equivocarse. Por ejemplo, en Gran Bretaña, era verano todo el año en 1970, pero:
$ 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
Los dos que uso con frecuencia son:
$ Perl -leprint\ scalar\ localtime\ 1234567890
Sat Feb 14 00:31:30 2009
y
$ tclsh
% clock format 1234567890
Sa Feb 14 00:31:30 CET 2009
Con zsh
puede usar el strftime
incorporado:
strftime formato de época Genere la fecha indicada por época en el formato especificado.
p.ej.
zmodload zsh/datetime
strftime '%A, %d %b %Y' 1234567890
Viernes 13 de febrero de 2009
También hay dateconv
de dateutils
:
dateconv -i '%s' -f '%A, %d %b %Y' 1234567890
Viernes 13 de febrero de 2009
tenga en cuenta dateutils
herramientas predeterminadas a UTC
(agregue -z your/timezone
si es necesario).
También puede usar un pequeño programa en C para imprimir la fecha y hora en el formato que Shell puede analizar directamente
#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;
}
uso:
#compile
clang -o Epoch2datetime main.c
#invoke
eval `./Epoch2datetime 1450196411`
echo $YEAR $MON $DAY $HOUR $MIN $SEC
#output
#2015 12 16 00 20 11
No sería una solución real sin un pequeño nodo.js:
Epoch2date(){
node -p "new Date($1)"
}
agregue eso a ~/.bash_aliases
y asegúrese de que se encuentre en ~/.bashrc
con . ~/.bash_aliases
if [ -f ~/.bash_aliases ]; then
. ~/.bash_aliases
fi
Para obtener el nodo en su sistema, vaya a http://nvm.sh y ejecute el comando curl. Instalará el administrador de versiones de nodo (nvm) que le permite cambiar las versiones de nodo.
Sólo tipo nvm ls-remote
y elige una versión para nvm install <version>
.
En PowerShell :
(([System.DateTimeOffset]::FromUnixTimeMilliSeconds($unixtime)).DateTime).ToString("s")