O horário atual em Los Angeles é 18:05. Mas quando corro TZ=UTC-8 date --iso=ns
, recebo:
2013-12-07T10:05:37,788173835+0800
O utilitário date me diz que a hora é 10:05 e até diz que está relatando como UTC + 8. Por quê?
O motivo é que TZ=UTC-8
é interpretado como um fuso horário POSIX . No formato do fuso horário POSIX, as três letras são a abreviação do fuso horário (que é arbitrária) e o número é o número de horas que o fuso horário está atrás do UTC. Portanto, UTC-8
significa um fuso horário abreviado "UTC" que é de -8 horas atrás do UTC real, ou UTC + 8 horas.
(Funciona assim porque o Unix foi desenvolvido nos EUA, atrás do UTC. Esse formato permite que os fusos horários dos EUA sejam representados como EST5, CST6 etc.)
Você pode ver o que está acontecendo com estes exemplos:
$ TZ=UTC-8 date +'%Z %z'
UTC +0800
$ TZ=UTC8 date +'%Z %z'
UTC -0800
$ TZ=FOO-8 date +'%Z %z'
FOO +0800
O -0800
formato do fuso horário ISO adota a abordagem oposta, -
indicando que a zona está atrás do UTC e +
indicando que a zona está à frente do UTC.
TZ=PST+8 date
. Obrigado. Também encontrei esta explicação emman timezone
: "A string std especifica o nome do fuso horário e deve ter três ou mais caracteres alfabéticos. A string de deslocamento segue imediatamente std e especifica o valor da hora a ser adicionado à hora local para obter o Tempo Universal Coordenado ( UTC). O deslocamento é positivo se o fuso horário local estiver a oeste do Meridiano Prime e negativo se estiver a leste. A hora deve estar entre 0 e 24 e os minutos e segundos 0 e 59. "TZ=America/Los_Angeles
. Você está esquecendo que o horário do Pacífico é -7 durante o horário de verão.TZ=:America/Los_Angeles
. Os dois pontos indicam que é um arquivo de fuso horário da Olson. E em outro comentário, ele mencionou que queria ignorar o horário de verão, o que não faria.EST-5
CST-6
.Sempre que você especifica um fuso horário no formato de +/- 00:00, está especificando um deslocamento , não o fuso horário real. A partir da
GNU libc
documentação (que segue o padrão POSIX):É por isso que parece ser o inverso do que você espera.
fonte
Why?
Porque o POSIX exige .
Portanto, isso dará um tempo próximo a [1]
Los Angeles
(com qualquer rótulo de três letras para o texto do fuso horário):E isso deve dar o tempo próximo
Shanghai, China
ouPerth, Australia
:[1] Próximo, pois pode haver algum horário de verão que altera a "hora local" real.
fonte
Como método alternativo, você pode usar o comando
zdump
para mostrar a hora atual em outros fusos horários + compensações.As mesmas regras se aplicam aos fusos horários; oeste do meridiano principal estar "atrás", enquanto o leste estar "à frente".
Exemplo
$ zdump PST PST Sáb 7 de dezembro 03:25:27 2013 PST
Eu criei esse script para mostrar vários dos fusos horários + desvios que estamos interessados em usar
zdump
edate
para podermos compará-los.Então, quando você o executa, pode ver a comparação de
zdump
paradate
:fonte