No Ubuntu 18.04, tenho o seguinte comportamento de date
:
$ date --version | head -n1
date (GNU coreutils) 8.28
$ date
Вт окт 8 13:18:18 MSK 2019
$ TZ=UTC date
Вт окт 8 10:18:23 UTC 2019
Até agora tudo bem. Mas agora estou tentando fazer o mesmo no Raspbian 9:
$ date --version | head -n1
date (GNU coreutils) 8.26
$ date
Tue Oct 8 13:18:50 MSK 2019
$ TZ=UTC date
Tue Oct 8 13:18:51 MSK 2019
Qual poderia ser o motivo da versão Raspbian de date
ignorar a TZ
variável de ambiente?
Posso pensar em duas causas possíveis:
o arquivo
/usr/share/zoneinfo/UTC
não está presente ou está corrompido no seu Raspbian 9, portanto,glibc
falha ao implementar a configuração da variável TZ e volta ao fuso horário padrão do sistema,você pode ter uma variável TZ configurada anteriormente que foi marcada como somente leitura, portanto, sua tentativa de alterá-la não terá efeito.
A maneira correta, padrão e portátil de definir por meio de
$TZ
um fuso horário chamado UTC e que está ativado (com deslocamento 0 para) o Tempo Universal durante todo o ano é com:Isso é independente e fornece a especificação completa para esse fuso horário. Isso informa que o deslocamento para UTC é 0 (durante todo o ano, pois não há parte do horário de verão especificado) e o rótulo (conforme relatado por,
date +%Z
por exemplo) é UTC.A especificação de fuso horário descrita por
TZ
pode ficar mais complicada, pois você também pode incorporar o nome e o deslocamento do horário de verão e as regras para quando mudar entre o horário de verão e inverno. No entanto, essas regras são limitadas e, em particular, não podem abranger casos em que as regras mudam de um ano para outro (e na maioria dos países, as regras mudaram ao longo do tempo ou usam regras diferentes do primeiro ou último domingo de algum mês) .É por isso que o POSIX também especifica
TZ=:something
, mas comosomething
é tratado, a implementação deixa a implementação definida para permitir que as implementações criem uma maneira melhor de definir um fuso horário para as zonas da vida real.Na maioria dos sistemas, isso é implementado usando o banco de dados tz da ICANN (eles também publicam códigos de referência para lidar com eles).
Então, você usaria
TZ=:Europe/London
, por exemplo, para o fuso horário da Grã-Bretanha continental, que abrange deslocamentos de fuso horário e quando a mudança para o ano atual e todos os anos anteriores em Londres.Na prática,
Europe/London
é interpretado como o caminho de um arquivo relativo a algumzoneinfo
diretório (geralmente/usr/share/zoneinfo
).No banco de dados tz, há também um
Etc/UTC
arquivo (comEtc/Universal
eEtc/Zulu
links para ele).Etc/GMT
é definido da mesma forma, exceto que o rótulo é GMT durante todo o ano (comEtc/GMT-0
,Etc/GMT+0
,Etc/Greenwich
como links).Portanto, você pode
TZ=:Etc/UTC
obter o mesmo efeito,TZ=UTC0
exceto que o sistema precisa abrir esseEtc/UTC
arquivo para descobrir as regras TZ mais simples: 0 deslocamento para UTC durante todo o ano.Em muitos (a maioria?) sistemas, há um
UTC
->Etc/UTC
symlink, então você também pode fazerTZ=:UTC
.TZ=UTC
em si não é POSIX, mas aqui na ausência de um deslocamento sendo dado, na maioria dos sistemas, é interpretado como o mesmo queTZ=:UTC
(procure a definição de fuso horário em/path/to/zoneinfo/UTC
. Mas se o banco de dados tz não estiver disponível, isso não funcionará.Observe também que
date
, especificamente, você pode usar a-u
opção para obter datas UTC, independentemente do que$TZ
contém.date -u
é equivalente aTZ=UTC0 date
.