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

59

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
Umang
fuente

Respuestas:

92

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 las herramientas principales 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, agregue la -uopción (estándar) o pase una TZ=UTC0variable de entorno para tener la fecha UTC ( TZ=UTC0 define una zona horaria llamada UTCcon desplazamiento 0 desde UTC mientras que el comportamiento para TZ=UTC(sin desplazamiento) no está especificado (aunque en la mayoría de los sistemas se referiría a un zona horaria definida por el sistema también llamada UTCcon desplazamiento 0 desde UTC)).

Stéphane Chazelas
fuente
1
Sin embargo, requiere mucha excavación, lo cual es sorprendente para una tarea tan común.
David Z
Gracias, acepté tu respuesta. Debería haber leído info coreutils dateun poco más cuidadosamente.
Umang
Esto me está dando una fecha ligeramente diferente: date -r 1447264553943resultados Wed Dec 28 01:39:03 BRST 47831, cuando en realidad es 11/11/2015, 3:55:53 PM GMT-2:00.
falmp
1
@falmp: funcionará si usas segundos en lugar de microsegundos.
@hop ops, debería haber figurado con el año 47831, pero ese número fue tan alto que me lo perdí. ¡Gracias!
falmp
6

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

$ date --date "Jan 1, 1970 00:00:00 +0000 + 1282367908 seconds"
Sat Aug 21 09:18:28 MSD 2010
AlexD
fuente
Gracias por eso. Esperaba que hubiera algo más simple, así que solo un voto positivo por ahora.
Umang
Otro gran ejemplo de cómo google te hace estúpido. ¿Ya nadie lee la documentación?
1
@hop, el soporte para date -d @xxxno se agregó hasta coreutils 5.3 en 2005. Así es como tenía que hacerlo antes de eso.
Stéphane Chazelas
@ StéphaneChazelas: a) esta respuesta es de 2010 yb) ¿por qué esto excusa buscar en Google antes de leer la documentación? Si responde por su propia autoridad, se puede excusar 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, sino obsoleta.
Stéphane Chazelas
6

Este perl one-liner lo hará:

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

Con conchas incorporadas:

  • 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 %ccon el strftime()formato que desee.

Stéphane Chazelas
fuente
¿Tiene una referencia para la bash printfsolución?
Derek Mahar
No importa, lo encontré en la descripción de printfen gnu.org/software/bash/manual/bashref.html#Bash-Builtins .
Derek Mahar
2

En osx, tener en UTC

date -r "1475737200" -u
nadie
fuente
Gracias. Lo he editado en la respuesta aceptada para que la información esté más fácilmente disponible.
Stéphane Chazelas
1

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

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

(Por cierto, su ejemplo parece estar apagado por un segundo)

cabeza de código
fuente
No funciona en Linux. la respuesta de hop parece tener la respuesta correcta de Linux. Gracias por señalar eso, sospeché que algo así sucedería, lo hice hace 45 segundos.
Umang
1

Responda a una pregunta anterior, pero creo que esto podría ser una mejora si alguien más lo busca. 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 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
}
Noah Spurrier
fuente