2010-07-14 16 views
79

¿Existe una manera rápida y única de convertir una marca de tiempo de Unix en una fecha de la línea de comandos de Unix?Convertir de Unix en la línea de comando

'Fecha' podría funcionar, excepto que es bastante incómodo especificar cada elemento (mes, día, año, hora, etc.), y no puedo encontrar la manera de hacerlo funcionar correctamente. Parece que podría haber una manera más fácil. ¿Me estoy perdiendo algo?

+2

¿Qué shell está utilizando? ¿Intento? Zsh? ¿Guión? –

+0

Bash - se olvidó de mencionar! – chimeracoder

+1

posible duplicado de [Cómo convertir marcas de tiempo a fechas en bash?] (Http://stackoverflow.com/questions/2371248/how-to-convert-timestamps-to-dates-in-bash) – user

Respuesta

106

Con GNU de date que puede hacer:

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

(De: BASH: Convert Unix Timestamp to a Date)

En OS X, utilice date -r.

date -r "$TIMESTAMP" 

Como alternativa, use strftime(). No está disponible directamente desde el shell, pero puede acceder a él a través del gawk. El especificador %c muestra la marca de tiempo de forma dependiente de la configuración regional.

echo "$TIMESTAMP" | gawk '{print strftime("%c", $0)}' 
# echo 0 | gawk '{print strftime("%c", $0)}' 
Wed 31 Dec 1969 07:00:00 PM EST 
1
awk 'BEGIN { print strftime("%c", 1271603087); }' 
49

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

+26

En OSX 10.8, es 'date -r 1278999698 + '% Y-% m-% d% H:% M:% S'' (GMT) o simplemente' date -r 1278999698' –

4

Si encuentra la notación incómoda, tal vez el -R -option sí ayuda. Supera la fecha en el formato RFC 2822. Por lo tanto, no necesitará todos los identificadores: date -d @1278999698 -R. Otra posibilidad es mostrar la fecha en segundos en su configuración regional: date -d @1278999698 +%c. Debería ser fácil de recordar :-)

2

La solución estándar Perl es:

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

(o localtime, si se prefiere)

18

Esta solución funciona con versiones de fecha que no soportan date -d @. No requiere AWK u otros comandos. Una marca de tiempo de Unix es la cantidad 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 usted está en un Mac, a continuación, utilizar:

date -r 1357004952 

de comandos para conseguir época:

date +%s 
1357004952 

crédito va a Anton: BASH: Convert Unix Timestamp to a Date

9

Como @ TomMcKenzie dice en un comentario a otra respuesta, date -r 123456789 es discutiblemente más común (es decir más ampliamente implementado) solución simple para los tiempos dados como segundos desde el Unix Epoch, pero desafortunadamente no hay una solución portátil universal garantizada.

La opción -d en muchos tipos de sistemas significa algo completamente diferente a la extensión --date de la fecha de GNU. Lamentablemente, GNU Date no interpreta -r de la misma forma que estas otras implementaciones. Por lo tanto, desafortunadamente debe saber qué versión de date está usando, y muchos comandos anteriores de Unix date no admiten ninguna de las opciones.

Lo que es peor, POSIX date reconoce ni -d ni -r y no proporciona ninguna manera estándar en cualquier comando en absoluto (que yo sepa) para dar formato a un tiempo de Unix desde la línea de comandos (ya que POSIX Awk también carece strftime()). (No se puede utilizar touch -t y ls porque el primero no acepta un momento dado como segundos desde el Epoch Unix.)

Nota pesar de que el único y verdadero Awk disposición directa de Brian Kernighan tiene ahora que la función strftime() incorporado así como una función systime() para devolver el tiempo actual en segundos desde la Época Unix), por lo que quizás la solución Awk sea la más portátil.

1

Corrección leve de 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 

La segunda es correcta. Creo que la razón es que en el Reino Unido, el horario de verano estuvo en vigor continuamente de 1968 a 1971.

+0

Gracias, he actualizado mi respuesta. – dabest1

2

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

date -r 1305712800 
Cuestiones relacionadas