
Mi sistema (Gnome 3 en Debian Testing) está confundido acerca de la hora actual. Cuando ejecuto date
la hora se muestra correctamente, pero algunas aplicaciones tienen un retraso de una hora. Por ejemplo, cuando agrego un evento al Calendario de Gnome, la hora del evento que se muestra en las citas del calendario será la hora que ingresé menos una hora.
Descubrí cuál es el problema pero no sé cómo solucionarlo:
$ date ; TZ=GMT date ; TZ=BST date
Sun 30 Apr 11:25:37 BST 2017
Sun 30 Apr 10:25:37 GMT 2017
Sun 30 Apr 10:25:37 BST 2017
Las dos primeras líneas del resultado son correctas, la tercera tiene un retraso de una hora. Lo que no puedo entender es por qué la zona horaria BST parece tener un retraso de una hora mientras que, al mismo tiempo, la hora actual es correcta y usa BST.
Esto también puede ser relevante:
$ timedatectl status
Local time: Sun 2017-04-30 11:33:07 BST
Universal time: Sun 2017-04-30 10:33:07 UTC
RTC time: Sun 2017-04-30 10:33:07
Time zone: Europe/London (BST, +0100)
Network time on: yes
NTP synchronized: yes
RTC in local TZ: no
Editar Salida de zdump /etc/localtime:
$ zdump /etc/localtime
/etc/localtime Sun Apr 30 12:22:53 2017 BST
$ date ; TZ=GMT date ; TZ=BST date
Sun 30 Apr 12:22:53 BST 2017
Sun 30 Apr 11:22:53 GMT 2017
Sun 30 Apr 11:22:53 BST 2017
Respuesta1
BST
no se reconoce como nombre de zona horaria. Se utiliza como abreviatura en la salida, pero no se puede utilizar para designar una zona horaria. La mayoría de los programas no verifican los nombres de las zonas horarias y utilizan silenciosamente GMT si no se reconoce el nombre de la zona horaria.
Las abreviaturas como BST, CET, EST, etc. no siempre están bien definidas y a veces son ambiguas (¿es la hora estándar del este de América del Norte o de Australia?). Son significativos sólo en una región determinada, mientras que la configuración de zona horaria normalmente está destinada a su uso en todo el mundo. Además, una abreviatura como BST en realidad no designa una zona horaria, sino sólo la hora en que se encuentra en una determinada zona horaria durante parte del año (en Gran Bretaña, mientras está en vigor el horario de verano). Por lo tanto, se deben utilizar designaciones inequívocas, la mayoría de las cuales siguen el patrón continente/ciudad. En los sistemas Linux típicos, y creo que también en muchas otras variantes de Unix, puede ver qué abreviaturas están disponibles buscando en el directorio /usr/share/zoneinfo
.
Entonces, en lugar de usar GMT
en invierno y BST
en verano, use Europe/London
.
Respuesta2
Como dijo @Gilles, BST es algo que se genera en date
/ date +%Z
, para decirles a los usuarios que es una fecha del horario de verano británico (es decir, GMT+1), no algo que defina una zona horaria, no es algo que pueda usar $TZ
.
Ese BST es importante para los usuarios británicos. Cuando un usuario británico ve 14:00 BST
, sabe que la marca de tiempo se refiere a las 14:00, hora de verano en Gran Bretaña continental (es decir, las 13:00 UTC). El uso de esos códigos de 3 a 4 letras está muy extendido en Gran Bretaña, EE. UU. y algunos otros países de habla inglesa, por lo que aparecen en la salida predeterminada de date
allí (en en_GB.UTF-8
las configuraciones regionales, por ejemplo). Por otro lado, la mayoría de los usuarios franceses no tendrán idea de lo que 14:00 CEST
significa (aunque CEST
se refiere aHorario de verano de Europa Central, el GMT+2 que se aplica en verano en Francia), por lo que notarás que cuando las fechas especifican la zona horaria, prefieren incluir el desplazamiento UTC que CET
/ CEST
allí (como mardi 2 mai 2017, 13:34:09 (UTC+0200)
).
La $TZ
variable no debe contener esos códigos de 3 a 4 letras. Contiene algo quedefine/especificala zona horaria, la región en la que se encuentra. Las aplicaciones lo usan para conocer el desplazamiento con UTC en cualquier momento, cuándo cambiar entre el horario de invierno y verano y cuál se mostrará el código (si corresponde) para el horario de invierno y verano. al usuario (para aquellos usuarios para quienes es importante).
Para eso, puede configurar TZ
alguna especificación de zona horaria definida por el sistema. Me gusta TZ=:Europe/London
(aunque muchos sistemas también lo aceptan TZ=Europe/London
) o contiene TZ
las reglas completas (aunque esas reglas son limitadas).
Por ejemplo, si lo uso TZ=:Europe/London
en mi sistema, las reglas se leerán desde /usr/share/zoneinfo/Europe/London
.
Ese archivo especificará, por ejemplo, que desde 1996, el desplazamiento de UTC es 0 desde el último domingo de octubre a las 2 a.m. UTC hasta el último domingo de marzo (con el nombre GMT para "hora media de Greenwich") y 1 en otro sentido (con el nombre BST para "British Summer Time"), mientras que desde 1970 (0 hora Unix) hasta 1972, fue 1 durante todo el año con el nombre BST para "British Summer Time".EstándarTiempo".
Ya puede ver que no tiene sentido utilizar BST como especificación de zona horaria. Primero, ha significado diferentes cosas en diferentes momentos, e incluso si solo consideramos la época actual, es solo un código para el horario de verano, por lo que no se puede utilizar como una especificación de zona horaria para todo el año.
Ahora también puedes TZ
contener las reglas completas. Por ejemplo, para el "horario estándar británico (no de verano)" de principios de los años 70, puede utilizar la forma más sencilla de especificación:
TZ=BST-1
Eso especifica una zona horaria que siempre está a 1 hora al este de UTC y para la cual date +%Z
siempre devuelve BST
. Esa zona horaria es correcta para Gran Bretaña continental a principios de los 70 y para el horario de verano desde 1972, pero no para el horario de invierno desde 1972 (y no podemos decirlo en el futuro).
O puede utilizar la especificación completa de las reglas actuales:
TZ=GMT0BST,M3.5.0/1:00:00,M10.5.0/2:00:00
Eso dice que hay dos períodos en el año, uno cuyo nombre es GMT con desplazamiento 0 y otro BST con desplazamiento 1 (implícito como 0+1 arriba cuando no se especifica), donde el cambio de uno a otro está activado. el último (5) domingo (0) de marzo (3) a las 1:00:00 UTC y nuevamente el último domingo de octubre a las 2:00.
Nuevamente, esa TZ funciona desde 1996 hasta ahora, pero no necesariamente de otra manera. Por ejemplo, para 1970-01-01 00:00:00 UTC (hora de la época 0 Unix, cuando la hora local era 1:00:00 BST (hora estándar británica) en Londres):
$ TZ=:Europe/London date -d @0
Thu 1 Jan 01:00:00 BST 1970
$ TZ=GMT0BST,M3.5.0/1:00:00,M10.5.0/2:00:00 date -d @0
Thu 1 Jan 00:00:00 GMT 1970
Por POSIX, el comportamiento de
TZ=BST-1
está bien definido (como se describe arriba)TZ=BST
(oTZ=GMT
/TZ=UTC
/TZ=Europe/London
) no está especificado.TZ=:BST
/TZ=:Europe/London
esimplementación definida. Es decir, los sistemas están destinados a respaldarlo y documentar lo que hace, aunque POSIX no nos dice qué se hace.
En el tercer caso anterior, en sistemas GNU (y creo que en la mayoría de los otros sistemas tipo Unix), cuando TZ
comienza con :
, lo que sigue se toma como una ruta a un archivo de definición de zona horaria. En el caso del sistema GNU, ese también es el caso cuando :
se omite (incluso si el valor forma una especificación de zona horaria válida como UTC0
, pero generalmente no deberían existir dichos archivos, aunque puedo ver algunas excepciones en mi sistema que lo convierten en un sistema que no es POSIX (por ejemplo, TZ=CST6CDT date -d 1943-01-01 +%Z
salidas CWT
en lugar de CST
porque hay un /usr/share/zoneinfo/CST6CDT
archivo 1 que define untiempo de guerrapara ese período)).
Esa ruta es generalmente una ruta relativa, en cuyo caso es relativa a $TZDIR
(o alguna opción predeterminada, como /usr/share/zoneinfo
cuando $TZDIR
no está configurada, como suele ser el caso). Por razones de seguridad, $TZDIR
las rutas absolutas o relativas con ..
componentes se ignoran en contextos de escalada de privilegios (como en contextos setuid).
Por lo general, en un sistema GNU, un TZ=:BST
, igual que TZ=BST
normalmente buscará un /usr/share/zoneinfo/BST
archivo. Si no se encuentra (como sería el caso, ya que BST
no es posible identificar una definición de zona horaria), normalmente asumirá la hora UTC y un nombre de zona horaria (como en date +%Z
la salida) de BST
.
1 Aquellos CST6CDT
como WET
, CET
, MET
... son restos de otra época. A finales de 1993, la base de datos de TZ (como ahoramantenido por la IANA)cambiódesde el uso de nombres ad hoc (y con mayor frecuencia ambiguos) (como MET
, GB-Eire
, WET
) hasta Area/City
dónde la ciudad es la ciudad más poblada (en el momento del lanzamiento) donde se aplica la zona (el área son áreas grandes como continente/océano). Para Gran Bretaña continental, donde solía usar GB-Eire
(no WET), ahora (desde 1993) usa Europe/London
. GB-Eire
(como WET
) todavía están disponibles para compatibilidad con versiones anteriores ( GB-Eire
ahora se vincula a Europe/London
, mientras que WET
se define como una zona que usa UTC en invierno y las reglas de la UE para el horario de verano (Gran Bretaña solo ha seguido las reglas de la UE desde 1996 y el Reino Unido ahora abandona la UE). nadie puede decir lo que depara el futuro)) pero no debería usarse ahora en nuevas implementaciones.
Respuesta3
Complementando la respuesta de Gilles; Estoy en la misma zona horaria que el OP. Hora de Europa Occidental, también conocida como WET
la denominación oficial; Si la memoria no me falla, se incluyó para Portugal en las zonas horarias de Unix alrededor de 1996.
https://en.wikipedia.org/wiki/Western_European_Time
La hora europea (WET, UTC±00:00) es una zona horaria que cubre partes del oeste y noroeste de Europa.
Los siguientes países y regiones utilizan WET en los meses de invierno:
- Islas Canarias, > desde 1946 (el resto de España es CET, UTC+1) - Islas Feroe, desde 1908
- Noreste de Groenlandia (Danmarkshavn y alrededores)
- Islandia, desde 1968
- Portugal, desde 1912 con pausas (excepto Azores, UTC−1)[1]
- Islas Madeira, desde 1912 con pausas[2]
- Irlanda, desde 1916 (legalmente conocida como hora media de Greenwich) excepto entre 1968 y 1971
- Reino Unido y dependencias de la Corona, desde 1847 en Inglaterra, Escocia, Gales, las Islas del Canal y la Isla de Man, y desde 1916 en Irlanda del Norte (conocida legalmente como hora media de Greenwich), con pausasEn el Reino Unido, de 1940 a 1945 se utilizó el horario de verano británico (BST=CET) en invierno, y de 1941 a 1945 y nuevamente en 1947, se utilizó el horario de verano doble británico (BDST=CEST) en verano. Entre el 18 de febrero de 1968 y el 31 de octubre de 1971, el BST se utilizó durante todo el año.
Todos los países mencionados anteriormente, excepto Islandia, implementan el horario de verano en verano, cambiando al horario de verano de Europa occidental (WEST, UTC+1), que está una hora por delante del WET. WEST se llama horario de verano británico en el Reino Unido y se conoce oficialmente como horario estándar irlandés en Irlanda.
Si bien la denominación oficial para el horario de verano es WEST (Western European Summer Time), WET
se utiliza para TZ
, y tiene en cuenta el horario de verano/DST, avanzando una hora.
"Europa/Londres" podría ser hoy en día una mejor opción, sin embargo, conocer la WET
taquigrafía sigue siendo útil en algunas situaciones.
https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
Entonces, para comparar los resultados con su prueba inicial:
$date ; TZ=GMT date ; TZ=WET date
Mon May 1 09:36:10 WEST 2017
Mon May 1 08:36:10 GMT 2017
Mon May 1 09:36:10 WEST 2017