Skip to main content

107.3 Horário e Fuso


Vamos ver um pouco sobre fuso horário, timezone e linguagens.

Timezone


O Linux trabalha com o UTC 000, mas é convertido de acordo com a localização configurada para o usuário. Para ver melhor isso, podemos usar o comando timedatectl.

$ timedatectl 
Local time: Fri 2021-06-11 16:37:30 -03
Universal time: Fri 2021-06-11 19:37:30 UTC
RTC time: Fri 2021-06-11 19:37:30
Time zone: America/Sao_Paulo (-03, -0300)
System clock synchronized: no
NTP service: inactive
RTC in local TZ: no
# Perceba que por aqui podemos ver se o NTP está ativo ou não.

Para ver a data usamos o comando date, caso a hora esteja errada a forma mais correta e simples para arrumarmos é usando a nossa localização, como foi mostrado no comando acima, usei a localização America/Sao_Paulo.


Temos 3 formas de mudar a localização:

  1. Reconfigurando o pacote tzdata (com root ou usando sudo):

    dpkg-reconfigure tzdata


  1. Mudando o link simbólico na mão (com root ou usando sudo):

    ln -sf /usr/share/zoneinfo/America/Sao_Paulo /etc/localtime


  1. Editando o arquivo na mão (com root ou usando sudo):

    vim /etc/timezone

    PS: Sempre evite editar o arquivo diretamente na mão, isso pode quebrar o sistema.



Definindo timezone de uma única sessão

Podemos definir um timezone apenas para a nossa sessão, isso não muda o timezone do sistema, apenas a nossa, ao deslogar perdemos essa configuração.

Para ajudar a encontrar a localização correta, podemos usar o comando tzselect, ele além de montar a nossa localização com base em algumas perguntas, ainda fornece um comando para copiar e rodar no sistema.


Para aplicar, você precisa adicionar a localização escolhida na variável chamada TZ e depois exportar ela.

## Escolhi a localização da cidade de Lagos na Nigéria:
# Vou definir a variável:
TZ='Africa/Lagos'

# Agora vamos exportar ela:
export TZ

# Rode o comando 'date' para verificar:
$ date
Fri Jun 11 20:53:50 WAT 2021

## Você pode deixar isso permanente colocando no '.profile' ou '.bashrc'.
# O comando 'timedatectl' mostra a configuração do sistema!


Localização


No Linux é conehcido como locales, é com eles que podemos definir o idioma, moedas, formato de hora/data, nome e algumas outras coisas que não usamos muito.


Para ver o que está configurado você pode usar o comando locale, já o localectl mostra apenas a linguagem e configurações de teclado.

Em ambientes com Gnome, em relação a linguagem do sistema e teclado, o Gnome gosta de controlar isso, ele por padrão pega a configuração inicial dos locales, mas se depois de instalado o Gnome voce mudar os locales, isso nao vai efeito quando usado com a interface gráfica, apenas em modo texto, porque o Gnome que vai passar a comandar isso.


O comando locale -a mostra todos que estão instalados e que podem ser usados. Você pode instalar o pacote referente a uma linguagem, mas você pode também adicionar ela (carregar) caso já esteja instalada:

## Verificando quais locales estão disponiveis:
$ locale -a
C
C.UTF-8
POSIX
en_AG
en_AG.utf8
en_AU.utf8
en_BW.utf8
en_CA.utf8
en_DK.utf8
en_GB.utf8
en_HK.utf8
en_IE.utf8
en_IL
en_IL.utf8
en_IN
en_IN.utf8
en_NG
en_NG.utf8
en_NZ.utf8
en_PH.utf8
en_SG.utf8
en_US.utf8
en_ZA.utf8
en_ZM
en_ZM.utf8
en_ZW.utf8

## Ativando o pt-BR junto com o ingles:
sudo locale-gen pt_BR.UTF-8 en_US.UTF-8

# Agora verifique novamente:
$ locale -a
C
C.UTF-8
en_AG
en_AG.utf8
en_AU.utf8
en_BW.utf8
en_CA.utf8
en_DK.utf8
en_GB.utf8
en_HK.utf8
en_IE.utf8
en_IL
en_IL.utf8
en_IN
en_IN.utf8
en_NG
en_NG.utf8
en_NZ.utf8
en_PH.utf8
en_SG.utf8
en_US.utf8
en_ZA.utf8
en_ZM
en_ZM.utf8
en_ZW.utf8
POSIX
pt_BR.utf8
# Acabamos de gerar os locales brasileiros, mas eles ainda não estão ativos.

Para rodar em todo o sistema, as variáveis de ambiente do locale devem estár em /etc/default/locale , após ser adicionadas lá, devemos rodar o comando sudo update-locale --locale-file=/etc/default/locale, lembrando que é opcional passar a localização nesse comando.

# Definindo os locales
$ sudo vim /etc/default/locale

### Conteúdo ###
LANG="en_US.UTF-8"
LC_NUMERIC="pt_BR.UTF-8"
LC_TIME="pt_BR.UTF-8"
LC_MONETARY="pt_BR.UTF-8"
LC_PAPER="pt_BR.UTF-8"
LC_NAME="pt_BR.UTF-8"
LC_ADDRESS="pt_BR.UTF-8"
LC_TELEPHONE="pt_BR.UTF-8"
LC_MEASUREMENT="pt_BR.UTF-8"
LC_IDENTIFICATION="pt_BR.UTF-8"
LC_ALL="en_US.UTF-8"
### Fim conteúdo ###

# Os escapes são necessários para colocar tudo certinho no arquivo. Com isso deixamos a linguagem do sistema em ingles e todos os outros parametros em portugues.

# Agora vamos atualizar:
$ sudo update-locale --locale-file=/etc/default/locale

# Verifique os locales ativo:
LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE=pt_BR.UTF-8
LC_NUMERIC=pt_BR.UTF-8
LC_TIME=pt_BR.UTF-8
LC_COLLATE="en_US.UTF-8"
LC_MONETARY=pt_BR.UTF-8
LC_MESSAGES="en_US.UTF-8"
LC_PAPER=pt_BR.UTF-8
LC_NAME=pt_BR.UTF-8
LC_ADDRESS=pt_BR.UTF-8
LC_TELEPHONE=pt_BR.UTF-8
LC_MEASUREMENT=pt_BR.UTF-8
LC_IDENTIFICATION=pt_BR.UTF-8
LC_ALL=

# Perceba que como não defini 'LC_MESSAGES', ele pegou o que colocamos em 'LC_ALL'. Mantemos o idioma em ingles e definimos alguns locales para brasileiro, o que nao for definido por nós ficará em ingles por causa do 'LC_ALL'.


Convertendo um formato do Windows para o UTF-8 usado Linux


Para isso usamos o comando iconv.

# Convertendo um arquivo salvo no Windows:
$ iconv -f ISO-8859-1 -t UTF-8 arquivo

# ISO-8859-1 é o formato usado no Windows, no Linux é o UTF-8, mas nem sempre.

# Gerando um arquivo salvo no Windows:
$ iconv -f ISO-8859-1 -t UTF-8 arquivo > novo_arquivo