La hora actual en Los Ángeles es 18:05. Pero cuando corro TZ=UTC-8 date --iso=ns
, obtengo:
2013-12-07T10:05:37,788173835+0800
La utilidad de fecha me dice que son las 10:05, e incluso dice que lo informa como UTC + 8. ¿Por qué?
La razón es que TZ=UTC-8
se interpreta como una zona horaria POSIX . En el formato de zona horaria POSIX, las 3 letras son la abreviatura de la zona horaria (que es arbitraria) y el número es la cantidad de horas que la zona horaria está detrás de UTC. Entonces, UTC-8
significa una zona horaria abreviada "UTC" que está −8 horas detrás del UTC real, o UTC + 8 horas.
(Funciona de esa manera porque Unix se desarrolló en los EE. UU., Que está detrás de UTC. Este formato permite que las zonas horarias de EE. UU. Se representen como EST5, CST6, etc.)
Puedes ver que eso es lo que sucede con estos ejemplos:
$ TZ=UTC-8 date +'%Z %z'
UTC +0800
$ TZ=UTC8 date +'%Z %z'
UTC -0800
$ TZ=FOO-8 date +'%Z %z'
FOO +0800
El -0800
formato de zona horaria ISO toma el enfoque opuesto, -
indicando que la zona está detrás de UTC e +
indicando que la zona está por delante de UTC.
TZ=PST+8 date
. Gracias. También encontré esta explicación enman timezone
: "La cadena estándar especifica el nombre de la zona horaria y debe tener tres o más caracteres alfabéticos. La cadena de desplazamiento sigue inmediatamente a la norma y especifica el valor de hora que se agregará a la hora local para obtener la hora universal coordinada ( UTC). El desplazamiento es positivo si la zona horaria local está al oeste del Meridiano principal y negativa si está al este. La hora debe estar entre 0 y 24, y los minutos y segundos 0 y 59. "TZ=America/Los_Angeles
. Olvida que la hora del Pacífico es -7 durante el horario de verano.TZ=:America/Los_Angeles
. Los dos puntos indican que es un archivo de zona horaria de Olson. Y en otro comentario, mencionó que quería ignorar el horario de verano, lo que no haría.EST-5
CST-6
.Cada vez que especifica una zona horaria en el formato de +/- 00:00, está especificando un desplazamiento , no la zona horaria real. De la
GNU libc
documentación (que sigue el estándar POSIX):Es por eso que parece ser lo contrario de lo que espera.
fuente
Why?
Porque POSIX lo requiere .
Entonces, esto dará tiempo cerca de [1]
Los Angeles
(con cualquier etiqueta de 3 letras para el texto de zona horaria):Y esto debería dar el tiempo cerca
Shanghai, China
oPerth, Australia
:[1] Cerca porque puede haber algún horario de verano (DST) que cambie la "hora local" real.
fuente
Como método alternativo, puede usar el comando
zdump
para mostrar la hora actual en otras zonas horarias + compensaciones.Las mismas reglas se aplican con las zonas horarias; al oeste del meridiano principal está "atrás" mientras que al este está "adelante".
Ejemplo
$ zdump PST PST sáb 7 dic 03:25:27 2013 PST
Hice este script para mostrar varias de las zonas horarias + compensaciones que estamos interesados en usar
zdump
ydate
para poder compararlas.A continuación, cuando se ejecuta se puede ver la comparación de
zdump
adate
:fuente