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 enWed Dec 28 01:39:03 BRST 47831
, cuando ' en realidad11/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
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
- ¿Tiene una referencia para
bash
printf
¿solución? - No importa, la encontré en la descripción de
printf
en gnu.org/software/bash/manual/bashref.html#Bash-Builtins .
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.
date -d @xxx
no se agregó hasta coreutils 5.3 en 2005. Eso ' s cómo tenías que hacerlo antes de eso.