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
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 entornoTZ
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:Explicación:
testdate
a una marca de tiempo Unix en la zona horariaEurope/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.%Z
para verificar que la zona horaria de entrada es realmenteCEST
.@
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
).%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 entornoTZ
enEurope/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.