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


183

¿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:


268

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

44
+1 por el comentario sobre la falta de portabilidad (¿por qué la especificación POSIX no incluye una forma de hacer esto? Grr)
Richard Hansen

3
¿Qué significa el @en date -d @1234567890? man dateno hizo referencia a eso ...
Chris Markle

10
Las páginas de manual de @ChrisMarkle GNU a menudo son lamentablemente incompletas. "El formato de cadena de fecha es más complejo de lo que se documenta fácilmente aquí, pero se describe completamente en la documentación de información". A saber: gnu.org/software/coreutils/manual/html_node/…
Gilles

2
El info datees bastante completo. La entrada en 28.9 Seconds since the Epochexplica en detalle sobre el @timestamp.

En Linux en una tubería: fecha + '% s' | xargs -I n date -d @n
Ivan Ogai

26

date -d @1190000000 Reemplace 1190000000 con su época


8
Asumiendo la fecha GNU, eso es.
Gilles

14
$ 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)


11

Con bash-4.2o por encima:

printf '%(%F %T)T\n' 1234567890

(donde %F %Testá el strftime()formato de tipo)

Esa sintaxis está inspirada ksh93.

En ksh93Sin 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 ksh93es:

printf '%(%F %T)T\n' '#1234567890'

ksh93sin 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

7

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.

¿Qué utilidad de impresión incluyó milisegundos (sin un punto)?

He visto que el servidor de aplicaciones WebLogic en su mayoría devuelve valores de tiempo de datos con milisegundos y sin puntos cuando se usa la herramienta de secuencias de comandos. por ejemplo, lastSuccessfulConnectionUse = 1455086371603
KnockTurnAl


Las herramientas de Atlassian registran sus marcas de tiempo como tiempo de época con milisegundos.
Br.Bill

6

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

6

Con zshusted podría usar el strftimeincorporado:

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 dateconvde dateutils:

dateconv -i '%s' -f '%A, %d %b %Y' 1234567890
Viernes 13 de febrero de 2009

tenga en cuenta las dateutilsherramientas predeterminadas para UTC(agregar -z your/timezonesi es necesario).


0

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

0

No sería una solución real sin un pequeño nodo.js:

epoch2date(){
    node -p "new Date($1)"
}

agregue eso ~/.bash_aliasesy asegúrese de que se obtiene ~/.bashrccon. ~/.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-remotey elija una versión para nvm install <version>.


0

Hay una manera más fácil de hacer esto: (([System.DateTimeOffset] :: FromUnixTimeMilliSeconds ($ unixtime)). DateTime) .ToString ("s")


Bienvenido a U&L! Por favor, eche un vistazo a las etiquetas de la pregunta: ¿funciona este código en algún shell en algún sistema Unix o similar a Unix?
fra-san

Esta técnica está utilizando Microsoft .NET. No parece que OP esté buscando una solución de MS.
user2320464
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.