Meu fuso horário BST está uma hora atrasado?

Meu fuso horário BST está uma hora atrasado?

Meu sistema (Gnome 3 no Debian Testing) está confuso sobre a hora atual. Quando executo, datea hora aparece corretamente, mas alguns aplicativos estão uma hora atrasados. Por exemplo, quando adiciono um evento ao Calendário do Gnome, o horário do evento mostrado nos compromissos do calendário será o horário que inseri menos uma hora.

Descobri qual é o problema, mas não sei como resolvê-lo:

$ 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

As duas primeiras linhas da saída estão corretas, a terceira está uma hora atrasada. O que não consigo entender é por que o fuso horário do BST parece estar uma hora atrasado e, ao mesmo tempo, o horário atual está correto - e usando o BST.

Isso também pode 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 Saída 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

Responder1

BSTnão é reconhecido como um nome de fuso horário. É usado como abreviação na saída, mas você não pode usá-lo para designar um fuso horário. A maioria dos programas não verifica os nomes dos fusos horários e assume silenciosamente o padrão GMT se o nome do fuso horário não for reconhecido.

Abreviações como BST, CET, EST, etc. nem sempre são bem definidas e às vezes ambíguas (é o horário padrão da América do Norte ou do Leste da Austrália?). Eles são significativos apenas em uma determinada região, enquanto a configuração de fuso horário normalmente se destina ao uso em todo o mundo. Além disso, uma abreviatura como BST na verdade não designa um fuso horário, mas apenas o horário em um determinado fuso horário durante parte do ano (Grã-Bretanha enquanto o horário de verão está em vigor). Portanto, você deve usar designações inequívocas, a maioria das quais segue o padrão continente/cidade. Em sistemas Linux típicos, e acho que também em muitas outras variantes do Unix, você pode ver quais abreviações estão disponíveis procurando no diretório /usr/share/zoneinfo.

Então ao invés de usar GMTno inverno e BSTno verão, use Europe/London.

Responder2

Como @Gilles disse, esse BST é algo gerado em date/ date +%Z, para informar aos usuários que é uma data do horário de verão britânico (portanto, GMT + 1), não algo que defina um fuso horário, não algo que você possa usar para $TZ.

Esse BST é significativo para os usuários britânicos. Quando um usuário britânico vê 14:00 BST, ele sabe que o carimbo de data/hora se refere às 14h, horário de verão na Grã-Bretanha continental (portanto, 13h UTC). O uso desses códigos de 3 a 4 letras é difundido na Grã-Bretanha, nos EUA e em alguns outros países de língua inglesa, portanto, apareça na saída padrão de datelá (em en_GB.UTF-8localidades, por exemplo). Por outro lado, a maioria dos utilizadores franceses não terá ideia do que 14:00 CESTsignifica (mesmo que CESTse refira aHorário de verão da Europa Central, o GMT+2 que se aplica no verão na França), então você notaria que quando as datas especificam o fuso horário, elas incluem o deslocamento UTC do que CET/ CESTlá (como mardi 2 mai 2017, 13:34:09 (UTC+0200)).

O$TZ variável não se destina a conter esses códigos de 3 a 4 letras. Ele contém algo quedefine/especificao fuso horário, a região em que você está. Os aplicativos o utilizam para saber a diferença com o UTC a qualquer momento, quando alternar entre o horário de inverno e verão e qual código (se houver) para o horário de inverno e verão seria exibido para o usuário (para aqueles usuários para quem é significativo).

Para isso, você pode definir TZalguma especificação de fuso horário definida pelo sistema. Gostar TZ=:Europe/London(embora muitos sistemas também aceitem TZ=Europe/London) ou TZconter as regras completas (embora essas regras sejam limitadas).

Por exemplo, se eu usar TZ=:Europe/Londonno meu sistema, as regras serão lidas em /usr/share/zoneinfo/Europe/London.

Esse arquivo especificará, por exemplo, que desde 1996, o deslocamento do UTC é 0 do último domingo de outubro às 2h UTC até o último domingo de março (com o nome GMT para "Horário de Greenwich") e 1 outro sentido (com o nome BST para "British Summer Time"), enquanto de 1970 (0 horário Unix) a 1972, foi 1 durante todo o ano com o nome BST para "British Summer Time".PadrãoTempo".

Você já pode ver que não faz sentido usar o BST como especificação de fuso horário. Primeiro, significou coisas diferentes em diferentes momentos, e mesmo se considerarmos apenas a época atual, é apenas um código para o horário de verão, portanto não pode ser usado como uma especificação de fuso horário para o ano inteiro.

Agora, você também pode TZconter as regras completas. Por exemplo, para o "horário padrão britânico (não de verão)" do início dos anos 70, você pode usar a forma mais simples de especificação:

TZ=BST-1

Isso especifica um fuso horário que é sempre 1 hora a leste do UTC e para o qual date +%Zsempre retorna BST. Esse fuso horário é correto para a Grã-Bretanha continental no início dos anos 70 e para o horário de verão desde 1972, mas não para o horário de inverno desde 1972 (e não podemos prever o futuro).

Ou você pode usar a especificação completa das regras atuais:

TZ=GMT0BST,M3.5.0/1:00:00,M10.5.0/2:00:00

Isso diz que há dois períodos no ano, um para o qual o nome é GMT com deslocamento 0 e um BST com deslocamento 1 (implícito como 0+1 acima quando não especificado), onde a mudança de um para o outro está ativada último (5) domingo (0) de março (3) às 1h00 UTC e volta no último domingo de outubro às 2h00.

Novamente, essa TZ funciona de 1996 até agora, mas não necessariamente de outra forma. Por exemplo, para 1970-01-01 00:00:00 UTC (0 hora da época Unix, quando a hora local era 1:00:00 BST (Horário Padrão Britânico) em 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, o comportamento para

  • TZ=BST-1está bem definido (como descrito acima)
  • TZ=BST(ou TZ=GMT/ TZ=UTC/ TZ=Europe/London) não é especificado.
  • TZ=:BST/ TZ=:Europe/Londonéimplementação definida. Isto é, os sistemas destinam-se a apoiá-lo e documentar o que isso faz, embora o POSIX não nos diga o que é feito.

No terceiro caso acima, em sistemas GNU (e acredito na maioria dos outros sistemas do tipo Unix), quando TZcomeça com :, o que se segue é considerado um caminho para um arquivo de definição de fuso horário. No caso do sistema GNU, esse também é o caso quando :é omitido (mesmo que o valor forme uma especificação de fuso horário válida como UTC0, mas geralmente não deveria existir tais arquivos, embora eu possa ver algumas exceções no meu sistema, o que o torna um sistema não POSIX (por exemplo, TZ=CST6CDT date -d 1943-01-01 +%Zsaídas CWTem vez de CSTporque há um /usr/share/zoneinfo/CST6CDTarquivo 1 que define umtempo de guerrapara esse período)).

Esse caminho geralmente é um caminho relativo e, nesse caso, é relativo a $TZDIR(ou algum padrão, como /usr/share/zoneinfoquando $TZDIRnão está definido, como geralmente é o caso). Por razões de segurança, $TZDIRcaminhos absolutos ou relativos com ..componentes são ignorados em contextos de escalonamento de privilégios (como em contextos setuid).

Normalmente, em um sistema GNU, um TZ=:BST, igual ao que TZ=BSTnormalmente procura por um /usr/share/zoneinfo/BSTarquivo. Se não for encontrado (como seria o caso, já que BSTnão é possível identificar uma definição de fuso horário), normalmente assumirá a hora UTC e um nome de fuso horário (como na date +%Zsaída) de BST.


1 Aqueles CST6CDTcomo WET, CET, MET... são resquícios de outra época. No final de 1993, a base de dados TZ (como agoramantido pela IANA)mudadodesde o uso de nomes ad hoc (e na maioria das vezes ambíguos) (como MET, GB-Eire, WET) até Area/Cityonde a cidade é a cidade mais populosa (no momento do lançamento) onde a zona se aplica (Área sendo grandes áreas como continente/oceano). Para a Grã-Bretanha continental, onde você costumava usar GB-Eire(não WET), você agora (desde 1993) usa Europe/London. GB-Eire(como WET) ainda estão disponíveis para compatibilidade com versões anteriores ( GB-Eireagora vinculados a Europe/London, enquanto WETé definido como uma zona que usa UTC no inverno e as regras da UE para horário de verão (a Grã-Bretanha só segue as regras da UE desde 1996 e com o Reino Unido agora saindo da UE, ninguém pode dizer o que o futuro reserva)) mas não deve ser usado agora em novas implantações.

Responder3

Complementando a resposta de Gilles; Estou no mesmo fuso horário do OP. Hora da Europa Ocidental, também conhecida como WETé a denominação oficial; se a memória não me falha, foi incluído para Portugal nos fusos horários Unix por volta de 1996.

https://en.wikipedia.org/wiki/Western_European_Time

O Horário Europeu (WET, UTC±00:00) é um fuso horário que cobre partes do oeste e noroeste da Europa.

Os seguintes países e regiões utilizam WET nos meses de inverno:
- Ilhas Canárias, > desde 1946 (o resto de Espanha é CET, UTC+1) - Ilhas Faroé, desde 1908
- Nordeste da Gronelândia (Danmarkshavn e arredores)
- Islândia, desde 1968
- Portugal, desde 1912 com pausas (exceto Açores, UTC−1)[1]
- Ilhas da Madeira, desde 1912 com pausas[2]
- Irlanda, desde 1916 (legalmente conhecido como Greenwich Mean Time) exceto entre 1968 e 1971
- Reino Unido e dependências da Coroa, desde 1847 na Inglaterra, Escócia, País de Gales, Ilhas do Canal e Ilha de Man, e desde 1916 na Irlanda do Norte (legalmente conhecido como Horário de Greenwich), com pausas

No Reino Unido, de 1940 a 1945, o horário de verão britânico (BST=CET) foi usado nos invernos, e de 1941 a 1945 e novamente em 1947, o horário de verão duplo britânico (BDST=CEST) foi usado nos verões. Entre 18 de fevereiro de 1968 e 31 de outubro de 1971, o BST foi utilizado durante todo o ano.

Todos os países acima, exceto a Islândia, implementam o horário de verão no verão, mudando para o horário de verão da Europa Ocidental (OESTE, UTC+1), que é uma hora antes do WET. WEST é chamado de Horário de Verão Britânico no Reino Unido e é oficialmente conhecido como Horário Padrão da Irlanda na Irlanda.

Enquanto a denominação oficial do horário de verão é WEST (Horário de Verão da Europa Ocidental), WETé usado para TZ, e leva em consideração o horário de verão/DST, avançando uma hora.

'Europa/Londres' pode ser hoje em dia uma escolha melhor, mas conhecer a WETtaquigrafia ainda é útil em algumas situações.

https://en.wikipedia.org/wiki/List_of_tz_database_time_zones

Então, para comparar os resultados com o seu teste 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

informação relacionada