¿Cómo puedo obtener una fecha formateada para una marca de tiempo UNIX desde la línea de comandos

Tengo una marca de tiempo UNIX y me gustaría obtener una fecha formateada (como la salida de date) correspondiente a esa marca de tiempo.

Mis intentos hasta ahora:

$ date +%s 1282367908 $ date -d 1282367908 date: invalid date `1282367908" $ date -d +1282367908 date: invalid date `+1282367908" $ date +%s -d +1282367908 date: invalid date `+1282367908" 

Me gustaría poder obtener resultados como:

$ TZ=UTC somecommand 1282368345 Sat Aug 21 05:25:45 UTC 2010 

Respuesta

En Mac OS X y BSD:

$ date -r 1282368345 Sat Aug 21 07:25:45 CEST 2010 $ date -r 1282368345 +%Y-%m-%d 2010-08-21 

con herramientas centrales de GNU (tienes que buscar en el archivo de información para eso):

$ date -d @1282368345 Sat Aug 21 07:25:45 CEST 2010 $ date -d @1282368345 --rfc-3339=date 2010-08-21 

Con cualquiera de los dos, agregue la opción -u (estándar) o pase un TZ=UTC0 variable de entorno para tener la fecha UTC (TZ=UTC0 define una zona horaria llamada UTC con desplazamiento 0 de UTC mientras que el comportamiento de TZ=UTC (sin compensación) no está especificado (aunque en la mayoría de los sistemas se referiría a un sistema definido zona horaria también llamada UTC con desplazamiento 0 de UTC)).

Comentarios

  • Se necesita mucho de excavar, lo cual es sorprendente para una tarea tan común.
  • Gracias, acepté tu respuesta. Debería haber leído info coreutils date con un poco más de atención.
  • Esto me da una fecha ligeramente diferente: date -r 1447264553943 resultados en Wed Dec 28 01:39:03 BRST 47831, cuando ' en realidad 11/11/2015, 3:55:53 PM GMT-2:00.
  • @falmp: funcionará si usa segundos en lugar de microsegundos.
  • @hop ops, debería haber calculado que el año es 47831, pero ese número era tan alto que lo perdí. ¡Gracias!

Responder

Este resumen de Perl lo hará:

$ perl -e "print scalar localtime $ARGV[0]" 1282367908 Sat Aug 21 09:18:28 2010 

Responder

Después de buscar en Google, encontré la manera de hacerlo con el date solo comando:

$ date --date "Jan 1, 1970 00:00:00 +0000 + 1282367908 seconds" Sat Aug 21 09:18:28 MSD 2010 

Comentarios

  • Gracias por eso. Esperaba que ' fuera algo más simple, así que solo un voto positivo por ahora.
  • Otro gran ejemplo de cómo Google te vuelve estúpido. ¿Ya nadie lee la documentación?
  • @hop, el soporte para date -d @xxx no se agregó hasta coreutils 5.3 en 2005. Eso ' s cómo tenías que hacerlo antes de eso.
  • @St é phaneChazelas: a) esta respuesta es de 2010 yb) por qué disculpe buscar en Google antes de leer la documentación? Si responde de su propia autoridad, uno puede disculparse por cometer errores como este, pero si tiene que buscarlo de todos modos, búsquelo correctamente.
  • @hop, solo estaba señalando que no era una respuesta estúpida, solo una desactualizada.

Respuesta

Con shell incorporado:

  • zsh (4.1.1 (2003) y superior):

    $ zmodload zsh/datetime $ TZ=UTC0 strftime %c 1282368345 Sat 21 Aug 2010 05:25:45 UTC 
  • ksh93 (ksh93i (2000) y superior):

    $ TZ=UTC0 printf "%(%c)T\n" "#1282368345" Sat Aug 21 05:25:45 2010 
  • bash (4.2 (2010) y superior):

    $ TZ=UTC0 printf "%(%c)T\n" 1282368345 Sat 21 Aug 2010 05:25:45 UTC 

En todos esos, reemplace %c con el strftime() formato que desee.

Comentarios

Respuesta

En osx, para tener en UTC

date -r "1475737200" -u 

Comentarios

  • Gracias. ' he editado eso en la respuesta aceptada para que la información esté más disponible.

Respuesta

Responde a una pregunta anterior, pero creo que esto podría ser una mejora si alguien más busca esto. Esta función Bash funciona tanto en Linux como en OS X. No he probado en ningún otro sistema BSD. Pase el tiempo de época como un argumento para esta función e imprimirá el formato de hora RFC-3339.

epochtorfc3339 () { RFC3339_FORMAT="+%FT%T:::%z" EPOCH=$(echo $@ | sed -n "s/.*\([0-9]\{10\}\).*/\1/p"); if date --version >/dev/null 2>/dev/null; then # Linux date ${RFC3339_FORMAT} -d "1970-01-01 UTC ${EPOCH} seconds" #date -d @${EPOCH} --rfc-3339=seconds else # OS X/BSD date -r ${EPOCH} ${RFC3339_FORMAT} fi } 

Respuesta

Otro buen ejemplo de la rica herencia de Unix moderno. De hecho, esto es posible en la mayoría de las variantes de BSD:

$ TZ=UTC date -r 1282368345 Sat Aug 21 05:25:45 UTC 2010 

(Por cierto, su ejemplo parece desviarse un segundo)

Comentarios

  • No ' t funciona en Linux. La respuesta de hop ' parece tener la respuesta correcta de Linux. Gracias por señalar eso, sospechaba que algo así sucedería, ' he cumplido 45 segundos.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *