Há algumas formas de definir a timezone em um ambiente Linux. A seguir é descrito como verificar a TZ definida no sistema, bem como alterar para alguma TZ desejada.
- Checar Timezone Definida no Sistema
- Definir TZ Usando
timedatectl
- Definir TZ Manualmente através de
/etc/localtime
- Instalando Timezones através de
tzdata
- Definindo Timezone através da Variável de Ambiente TZ
Para verificar a TZ usada no sistema, é possível usar o comando date
. Esse comando informa a data, hora e TZ configurada.
Informações de data com date
:
date
# Sat Oct 22 09:47:44 UTC 2022
No exemplo acima, a TZ definida no sistema é UTC (Coordinated Universal Time).
Também há casos em que é mostrado apenas o offset para a hora em UTC, como nesse exemplo, em que a timezone definida é UTC−3:
date
# Sun Oct 23 11:58:27 PM -03 2022
A forma mais simples de configurar TZ em um sistema Linux talvez seja usando timedatectl
, que está disponível em muitas distribuições. Com ele é possível listar as timezones disponíveis e definir uma para o sistema. Além de outras operações relacionadas a horário, como definir a hora do sistema, e ativar ou desativar a sincronização de hora por NTP (Network Time Protocol).
Listar timezones com timedatectl
:
timedatectl list-timezones
Com a lista de timezones disponíveis no sistema, é possível definir a TZ com o comando set-timezone
, como por exemplo definir o sistema para o fuso de São Paulo:
Definir uma timezone:
timedatectl set-timezone America/Sao_Paulo
Caso não seja possível usar timedatectl
, há uma forma mais tradicional para configurar a TZ do sistema, que é difinir um link simbólico no diretório /etc/localtime
para um arquivo de timezone em /usr/share/zoneinfo
, ou copiar um arquivo de timezone para /etc/localtime
.
Primeiro, é preciso localizar as timezones disponíveis no sistema, listando o conteúdo do diretório /usr/share/zoneinfo
Listando timezones disponíveis no sistema:
ls /usr/share/zoneinfo
Caso não exista timezones salvas, é possivel Instalar através de tzdata
As timezones geralmente estão organizadas nesse diretório em regiões como continentes ou países
Exemplo da TZ de São Paulo no Debian:
ls /usr/share/zoneinfo/America/Sao_Paulo
Para definir a TZ no sistema dever ser criado um symbolic link no diretório /etc/localtime
, apontando para algum arquivo de timezone em /usr/share/zoneinfo
Primeiramente é necessário remover o arquivo previamente salvo (caso exista)
Removendo a TZ previamente salva:
rm -rf /etc/localtime
Então pode ser criado um link simbólico para algum arquivo de TZ disponível no sistema
Criando um symbolic link para TZ de São Paulo:
ln -s /usr/share/zoneinfo/America/Sao_Paulo /etc/localtime
De forma alternativa à criar um link simbólico, é possível copiar o arquivo para o diretório /etc/localtime
Copiando um arquivo de timezone para /etc/localtime
cp /usr/share/zoneinfo/America/Sao_Paulo /etc/localtime
Há alguns programas que não usam /etc/localtime
como arquivo de timezone, ao invés disso, leem o arquivo /etc/timezone
. Diferentemente de /etc/localtime
, que é um arquivo binário, /etc/timezone
é um arquivo de texto que contém o caminho para algum arquivo de timezone, por exemplo a informação de: "America/Sao_Paulo". Essa informação é usada pelo programa para definir seu fuso horário pela sua base de dados.
Sendo assim, é interesante, além de configurar o arquivo /etc/localtime
, também criar o arquivo /etc/timezone
, e deixa-lo sempre atualizado com a timezone utilizada no sistema, pois esses dois arquivos podem estar divergentes.
Configurando o arquivo /etc/timezone
echo "America/Sao_Paulo" > /etc/timezone
Em alguns ambientes específicos, como containers minificados, há a possibilidade de não haver arquivos de timezone pre instalados no sistema. Para resolver isso, é possível instalar o pacote tzdata
. Esse pacote contém arquivos de regras para vários fusos do mundo, baseado na Time Zone Database.
Instalando tzdata
no Alpine Linux:
apk add tzdata
Instalando tzdata
no Ubuntu Server
apt install tzdata
Com esse pacote instalado, é criado arquivos de TZ no diretório /usr/share/zoneinfo/
e então é possível definir uma timezone manualmente
Se um sistema possui timezones disponíveis, é possível configurar a timezone do sistema através da variável de ambiente TZ
, definindo para essa variável a timezone desejada.
No exemplo abaixo é definida a TZ de New York para um container Docker Debian.
Subindo um container Debian com a TZ definida através de variável de ambiente
docker container run -it -e TZ="America/New_York" debian
Dentro do container, com o comando date
, temos a informação que foi definido o fuso EDT (Eastern Time Zone).
date
# Mon Oct 24 10:13:14 EDT 2022