es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Convertir la fecha en una zona horaria diferente con `date`

Estoy tratando de convertir fechas de diferentes zonas horarias con el comando UNIX date (estoy en Ubuntu 20.04).

Con la fecha actual, funciona bien:

$ date
dom. 12 dic. 2021 11:59:16 CET
$ TZ=Pacific/Tahiti date
dom. 12 dic. 2021 00:59:32 -10

Pero cuando trabajo con una cadena, no funciona:

$ export testdate="2021/10/28 17:47:26"
$ date -d "$test"
jue. 28 oct. 2021 17:47:26 CEST
$ TZ=Pacific/Tahiti date -d "$test"
jue. 28 oct. 2021 17:47:26 -10

como esperaba:

jue. 28 oct. 2021 05:47:26 -10

No entiendo por qué no obtengo el desplazamiento adecuado. Y, por supuesto, si intento con una fecha y hora en la que también debería cambiar el día, tampoco funciona:

$ export test="2021/10/28 7:47:26"
$ date -d "$test"
jue. 28 oct. 2021 07:47:26 CEST
$ TZ=Pacific/Tahiti date -d "$test" "+%F %T %Z"
2021-10-28 07:47:26 -10

mientras espero:

mié. 27 oct. 2021 19:47:26 -10

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema encontrado está relacionado con el hecho de que date utiliza la zona horaria del sistema de forma predeterminada al analizar cadenas de fecha con la opción -d. Una posible solución es especificar explícitamente la zona horaria de entrada utilizando la variable de entorno TZ y luego convertirla a la zona horaria de salida deseada.

    Por ejemplo, para convertir la cadena testdate de CEST a la zona horaria Pacific/Tahiti, puedes hacer lo siguiente:

    $ export testdate="2021/10/28 17:47:26"
    $ TZ=Europe/Paris date -d "$testdate" +"%s %Z"
    1635457646 CEST
    $ TZ=Pacific/Tahiti date -d "@$(TZ=Europe/Paris date -d "$testdate" +"%s")" +"%a %e %b %Y %T %Z"
    Wed 27 Oct 2021 19:47:26 -10
    

    Explicación:

    • Primero, convertimos la cadena de entrada testdate a una marca de tiempo Unix en la zona horaria Europe/Paris utilizando la opción -d y el especificador de formato %s que devuelve el número de segundos desde 1970-01-01 00:00:00 UTC.
    • También agregamos el especificador de formato %Z para verificar que la zona horaria de entrada es realmente CEST.
    • A continuación, utilizamos el prefijo @ con la marca de tiempo Unix para especificar que deseamos convertirla en la fecha y hora correspondientes en la zona horaria objetivo (en este caso, Pacific/Tahiti).
    • Por último, formateamos la cadena de fecha resultante utilizando el especificador de formato %a %e %b %Y %T %Z que devuelve el nombre abreviado del día de la semana (por ejemplo, Wed), el día del mes sin ceros iniciales (por ejemplo, 27), el nombre abreviado del mes (por ejemplo, Oct), el año (por ejemplo, 2021), la hora en horas, minutos y segundos (por ejemplo, 19:47:26) y el nombre de la zona horaria (por ejemplo, -10).

    Ten en cuenta que el especificador %s devuelve la marca de tiempo Unix relativa a UTC, por lo que es necesario establecer la variable de entorno TZ en Europe/Paris para tener en cuenta el desplazamiento de horario de verano (1 hora adelantada con respecto a UTC en octubre). Si no haces esto, es posible que obtengas resultados incorrectos.

Comments are closed.