¿Cómo convierto una marca de tiempo de época 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).
¿Cómo convierto una marca de tiempo de época 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).
Respuestas:
En * BSD:
date -r 1234567890
En Linux (específicamente, con GNU coreutils ≥5.3):
date -d @1234567890
Con versiones anteriores de la fecha GNU, 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 de shell POSIX (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
@
en date -d @1234567890
? man date
no hizo referencia a eso ...
info date
es bastante completo. La entrada en 28.9 Seconds since the Epoch
explica en detalle sobre el @timestamp.
$ 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 tiempo de época 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); }'
Pregunta SO vinculada: https://stackoverflow.com/questions/3249827/convert-from-unixtime-at-command-line
Con bash-4.2
o por encima:
printf '%(%F %T)T\n' 1234567890
(donde %F %T
está el strftime()
formato de tipo)
Esa sintaxis está inspirada ksh93
.
En ksh93
Sin embargo, el argumento se toma como una expresión de la fecha en que se soportan varios formatos y apenas documentados.
Para un tiempo de época Unix, 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
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 zsh
usted podría usar el strftime
incorporado:
formato de tiempo de ejecución epochtime Muestra la fecha indicada por epochtime 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 las dateutils
herramientas predeterminadas para UTC
(agregar -z your/timezone
si es necesario).
También podría usar un pequeño programa en C para imprimir la fecha y hora en el formato que el 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 ~/.bash_aliases
y asegúrese de que se obtiene ~/.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.
Simplemente escriba nvm ls-remote
y elija una versión para nvm install <version>
.
Hay una manera más fácil de hacer esto: (([System.DateTimeOffset] :: FromUnixTimeMilliSeconds ($ unixtime)). DateTime) .ToString ("s")