Até onde eu sei, o horário do leste dos Estados Unidos é GMT-5 para Eastern Standard Time e GMT-4 para Eastern Daylight Time.
Então, por que esses dois comandos dão horas diferentes nas respostas?
laptop % TZ=EST5EDT date
Wed Apr 27 12:16:36 EDT 2022
laptop % TZ=GMT-4 date
Wed Apr 27 20:16:40 GMT 2022
Não deveriam ser iguais?
Na verdade, existem duas maneiras principais de usar a variável TZ. O mais antigo é especificado nos padrões POSIX e pode codificar o fuso horário e as regras de horário de verão do ano atual na variável real. Por exemplo, um fuso horário europeu UTC + 2 horas pode ser totalmente especificado como este estilo POSIX:
Observe que esse formato assume que a regra do horário de verão para o ano atual também se aplica a quaisquer anos passados e futuros... uma suposição que provavelmente não está correta.
Como isso era claramente menos do que desejável, muitos sistemas operacionais de estilo unix usam a variável de ambiente TZ como referência a uma tabela mais extensa de informações de fuso horário, cobrindo definições atuais e históricas para um fuso horário específico.
A mais abrangente dessas implementações baseadas em tabelas é o banco de dados de informações de fuso horário Olson, que agora é mantido pela IANA . Um valor TZ no estilo Olson geralmente está em
<Continent>/<City>
formato, mas o banco de dados também tem algumas outras opções. Você pode usar qualquer forma na variável TZ, mas se o valor for ambíguo, o formato POSIX terá precedência, pois é o padrão estabelecido .A definição padrão POSIX da variável TZ é "para trás" do que você pode supor naturalmente. O número após o primeiro rótulo de fuso horário identifica o número de horas que você deve adicionar à hora local para obter a hora UTC .
Provavelmente porque antes do desenvolvimento do padrão POSIX, já existiam versões diferentes da convenção de variáveis de ambiente TZ... e como o Unix foi originalmente desenvolvido no Hemisfério Ocidental, as convenções existentes tendiam a usar números positivos para fusos horários dos EUA. (Durante os primeiros dias do Unix, ninguém pode ter adivinhado que uma ramificação principalmente acadêmica do projeto de desenvolvimento do MULTICS OS se tornaria algo maior e de longa duração.)
Eu entendi que os desenvolvedores das especificações POSIX tentaram ao máximo encontrar o comportamento que já era o mais comum e o codificaram como padrão, a menos que houvesse uma razão muito óbvia para fazer o contrário.
Então,
TZ=GMT-4
é interpretado no estilo POSIX ... e não significa "um fuso horário GMT menos quatro horas": na verdade significa "um fuso horário quatro horas à frente do UTC e chamado GMT". Você pode chamar seus fusos horários personalizados como quiser, eu acho, mas reutilizar um identificador de fuso horário histórico bem conhecido para algo totalmente diferente causará confusão.Se você deseja especificar um fuso horário apenas por "GMT" no Linux, deve usar o novo estilo Olson de configurações TZ adicionando o
Etc/
prefixo ... e mesmo assim, a convenção de sinal é invertida do que você esperaria, provavelmente para mantenha a analogia com as configurações de estilo POSIX mais antigas.Comparar: