it-swarm-es.tech

¿Cómo convierto una marca de tiempo de Epoch a un formato legible para humanos en el cli?

¿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).

196
xenoterracide

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

28
fschmitt
$ 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)
14
Stefan Lasiewski

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

12
Ivan Chau

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.
12
KnockTurnAl

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
11
Stéphane Chazelas

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
7
al.

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).

7
don_crissti

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
0
Meow

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>.

0
chovy

En PowerShell :

(([System.DateTimeOffset]::FromUnixTimeMilliSeconds($unixtime)).DateTime).ToString("s")
0
Kulwinder Singh