Convertir la marca de tiempo de Unix en una cadena de fecha

128

¿Hay una forma rápida y unívoca de convertir una marca de tiempo de Unix en una fecha desde la línea de comandos de Unix?

datepodría funcionar, excepto que es bastante incómodo especificar cada elemento (mes, día, año, hora, etc.), y no puedo entender cómo hacer que funcione correctamente. Parece que podría haber una manera más fácil: ¿me estoy perdiendo algo?

quimeracoder
fuente

Respuestas:

181

Con GNU's datepuedes hacer:

date -d "@$TIMESTAMP"
# date -d @0
Wed Dec 31 19:00:00 EST 1969

(De: BASH: Convertir la marca de tiempo de Unix en una fecha )

En OS X, use date -r.

date -r "$TIMESTAMP"

Alternativamente, use strftime(). No está disponible directamente desde el shell, pero puede acceder a través de gawk . El %cespecificador muestra la marca de tiempo de forma local.

echo "$TIMESTAMP" | gawk '{print strftime("%c", $0)}'
# echo 0 | gawk '{print strftime("%c", $0)}'
Wed 31 Dec 1969 07:00:00 PM EST
John Kugelman
fuente
3
Asegúrese de eliminar los milisegundos de la marca de tiempo (eso es solo 10 dígitos en lugar de 13), de lo contrario obtendrá resultados no válidos (esto es cierto para la fecha de macOS).
emerino
Pensé que esto no estaba funcionando, hasta que me di cuenta de que tenía una marca de tiempo en milis. Corta los últimos 3 dígitos y obtendrás la hora exacta
Stewart
64

date -d @1278999698 +'%Y-%m-%d %H:%M:%S' Donde el número detrás @es el número en segundos

qbi
fuente
28
En OSX 10.8, es date -r 1278999698 +'%Y-%m-%d %H:%M:%S'(GMT) o simplementedate -r 1278999698
Tom McKenzie
Funciona para Ubuntu 16.04
Mike Q
24

Esta solución funciona con versiones de fecha que no son compatibles date -d @. No requiere AWK u otros comandos. Una marca de tiempo Unix es el número de segundos desde el 1 de enero de 1970, UTC, por lo que es importante especificar UTC.

date -d '1970-01-01 1357004952 sec UTC'
Mon Dec 31 17:49:12 PST 2012

Si estás en una Mac, usa:

date -r 1357004952

Comando para obtener época:

date +%s
1357004952

El crédito va a Anton: BASH: Convertir la marca de tiempo de Unix en una fecha

dabest1
fuente
10

Como @TomMcKenzie dice en un comentario a otra respuesta, date -r 123456789 podría decirse que es una solución simple más común (es decir, más ampliamente implementada) para tiempos dados como segundos desde la época de Unix, pero desafortunadamente no hay una solución portátil universal garantizada.

La -dopción en muchos tipos de sistemas significa algo completamente diferente a la --dateextensión de GNU Date . Lamentablemente, GNU Date no interpreta -rlo mismo que estas otras implementaciones. Así que desafortunadamente tienes que saber qué versión dateestás usando y muchos Unix más antiguosdate comandos no admiten ninguna de las opciones.

Peor aún, POSIX dateno reconoce ninguno -dni -rproporciona ninguna forma estándar en ningún comando (que yo sepa) para formatear un tiempo Unix desde la línea de comandos (ya que POSIX Awk también carece strftime()). (No puedes usar touch -tyls porque el primero no acepta un tiempo dado en segundos desde la época de Unix).

Tenga en cuenta que The One True Awk disponible directamente de Brian Kernighan ahora tiene la strftime()función incorporada, así como una systime()función para devolver el tiempo actual en segundos desde la época de Unix), por lo que tal vez la solución Awk sea la más portátil.

Greg A. Woods
fuente
4

Si encuentra la notación incómoda, tal vez la -Ropción sí ayuda. Expulsa la fecha en formato RFC 2822. Por lo que no necesitará todos esos identificadores: date -d @1278999698 -R. Otra posibilidad es la de salida de la fecha en cuestión de segundos en su localidad: date -d @1278999698 +%c. Debería ser fácil de recordar. :-)

qbi
fuente
2

Ligera corrección a la respuesta de dabest1 anterior. Especifique la zona horaria como UTC, no GMT:

$ date -d '1970-01-01 1416275583 sec GMT'
Tue Nov 18 00:53:03 GMT 2014
$ date -d '1970-01-01 1416275583 sec UTC'
Tue Nov 18 01:53:03 GMT 2014

El segundo es correcto. Creo que la razón es que en el Reino Unido, el horario de verano estuvo en vigor continuamente desde 1968 hasta 1971.

Tony Mountifield
fuente
2

La solución estándar de Perl es:

echo $TIMESTAMP | perl -nE 'say scalar gmtime $_'

(o tiempo local, si lo prefiere)

William Pursell
fuente
1
awk 'BEGIN { print strftime("%c", 1271603087); }'
Sjoerd
fuente
1

Otros ejemplos aquí son difíciles de recordar. En su forma más simple:

date -r 1305712800
denmojo
fuente
Resultados mixtos: no funciona en ubuntu Linux pero sí en Mac OS X, por ejemplo.
Mike Q
1

Ponga lo siguiente en su ~ / .bashrc:

function unixts() { date -d "@$1"; }

Ejemplo de uso:

$ unixts 1551276383

Wed Feb 27 14:06:23 GMT 2019
Dangelov
fuente
-1

Pitón:

python -c "from datetime import datetime; print(datetime.fromtimestamp($TIMESTAMP))"
Itachi
fuente