Definindo o fuso horário no terminal

210

Quero alterar o fuso horário do relógio do sistema do terminal.

Isso pode ser feito com

tzselect

"que abre uma interface gráfica no terminal"

ou

sudo cp /usr/share/zoneinfo/Europe/London /etc/localtime

"que será definido como gmt"

Mas existe uma maneira de definir o fuso horário apenas com o deslocamento, ie.-1 ou +5 etc?

Preciso fazer isso enquanto escrevo um aplicativo para ajustar o tempo limite ou os logs de relatório, e as únicas informações que tenho são o IP do usuário. Posso usar um aplicativo da Web para encontrar a localização do IP, mas preciso definir o deslocamento, o que seria fácil se eu conseguisse obter o deslocamento do local, mas se precisar encontrar zona e cidade, seria uma dor real .

Se alguém souber a resposta de como acertar o relógio do sistema com +/- hora, seria ótimo.

user2155009
fonte
Ajude-nos a escolher a resposta aceita. Acho @ resposta de Mitch é a melhor askubuntu.com/a/323163/22308
Nam G VU
1
@NamGVU Não, a Mitch's não é a melhor solução, é uma resposta "GUI em um terminal". Até o OP disse que "isso não funcionará, pois preciso alterar o fuso horário de um programa sem a entrada do usuário. Preciso de um comando para alimentar a solução de terminal e não a GUI" , e esse é o mesmo objetivo que a maioria das pessoas desejaria ao procurar uma "solução de terminal, "um script-friendly. Collin Anderson é melhor se você conhecer uma cidade, ou Ryan para plain GMT + -n
Xen2050
No ubuntu 18.04, o tzselect não abre uma GUI. Possui uma seleção de menu baseada em terminal.
Tim Richardson

Respostas:

321

Para alterar o fuso horário do terminal, basta pressionar Ctrl+ Alt+ Tno teclado para abrir o Terminal. Quando abrir, execute o (s) comando (s) abaixo:

sudo dpkg-reconfigure tzdata

Depois de aberto, basta seguir as telas para alterar o fuso horário.

Mitch
fonte
14
isso não vai funcionar como eu preciso fuso horário altr de um programa sem entrada do usuário eu preciso de um comando i pode alimentar no terminal não solução gui Obrigado pela resposta
user2155009
1
valeu!!! isso ajuda, byt eu já mudei manualmente etc / fuso horário =) como php.net/manual/en/timezones.php !!! absolutamente idêntico !!!
Vladimir Ch
A reconfiguração de tzdata parece ajustar o relógio do hardware também para que o horário exibido permaneça o mesmo após a troca do fuso horário. Você pode querer isso se o seu horário estiver correto, mas o fuso horário estiver errado. No entanto, você definitivamente não quer tocar no relógio do hardware enquanto viaja. A abordagem timedatectl parece alterar apenas o fuso horário.
Cobra
@SnakE para mim exibida mudança de horário em conformidade
Riad
eu mudei de massa de vidraceiro da linha de commad sem nenhum problema porque você disse que meu amigo? @ADTC
sabre tabatabaee yazdi
170

Você também pode usar o novo timedatectlpara definir o horário no 14.04.

sudo timedatectl set-timezone America/New_York
Collin Anderson
fonte
Como você o instala no ubuntu?
Divisão por Zero
1
É instalado por padrão no 14.04.
Collin Anderson
6
Para ver todas as opções disponíveis, você pode executar ls -R --group-directories-first /usr/share/zoneinfo. (Cuidado para não modificar ou apagar nenhum arquivo aqui.) Mais informações sobre posixe rightprefixos estão aqui .
ADTC
Isso funciona! ...
Dan Nissenbaum
3
Use sudo timedatectl set-timezone Etc/UTCpara UTC.
Zoltán
19

Você pode usar os arquivos GMT ± x em /usr/share/zoneinfo/Etc.

sudo ln -fs /usr/share/zoneinfo/Etc/GMT$offset /etc/localtime
Ry-
fonte
obrigado atribuir a resposta estou recebendo um erro ln: falha ao criar link simbólico `/ etc / localtime ': o arquivo existe oboiusly não tenho certeza do que estou fazendo, você conhece um bom tutorial para isso ou até mesmo algumas palavras-chave que eu posso pesquisar no google? usando o comando corretamente? im usando sudo ln / usr / share / zoneinfo / Etc / GMT $ + 1 / etc / localtime para definir relógio para + 1gmt
user2155009
9
minitech esqueceu a bandeira vigor Acho que sim -> sudo ln -sF ....
Tele
1
Isso meio que funcionará, mas não atualizará o nome tz /etc/timezone.
poolieby
1
Para atualizar o fuso horário / etc /, executesudo dpkg-reconfigure --frontend noninteractive tzdata
Pierre Gramme
17

Sei que esse segmento é um pouco antigo, mas eu estava procurando uma solução melhor, porque precisava definir automaticamente o fuso horário em uma VM depois que um usuário o baixa do nosso site e o implanta. Aqui está o que eu acabei com:

echo "Setting TimeZone..."
export tz=`wget -qO - http://geoip.ubuntu.com/lookup | sed -n -e 's/.*<TimeZone>\(.*\)<\/TimeZone>.*/\1/p'` &&  timedatectl set-timezone $tz
export tz=`timedatectl status| grep Timezone | awk '{print $2}'`
echo "TimeZone set to $tz"

Isso consultará o geoip.ubuntu.com no servidor depois que ele for iniciado na nova rede (meu script verifica primeiro a conectividade) e depois define o fuso horário do servidor com base na resposta.

O "wget ​​-q0 -" diz ao wget para enviar apenas os resultados ao stdout, que é então canalizado para a variável $ tz.

Espero que ajude alguém!

Clayton Dukes
fonte
1
Ótimo! No Ubuntu 16.04, deve ser "grep zone" e "print $ 3".
user334639
Proponho um cli diferente para obter o fuso horário. Um pouco mais limpo na minha opinião: curl -s ' geoip.ubuntu.com/lookup ' | xmllint --xpath '/ Response / TimeZone / text ()' -
Darko Miletic
11

TL; DR /etc/localtime é um link simbólico que aponta para um arquivo em /usr/share/zoneinfo/Continent/City. Ao alterar para onde aponta, você pode alterar seu fuso horário.

Para alterar o fuso horário, remova o /etc/localtimelink simbólico e atribua à sua cidade desejada. Por exemplo, ls -l /etc/localtimerelatórios que este arquivo aponta para /usr/share/zoneinfo/America/Denver. Para mudar para Nova York, eu faço

  1. sudo rm /etc/localtime
  2. sudo ln -s /usr/share/zoneinfo/America/New_York /etc/localtime
  3. Aguarde um minuto para que meu relógio seja atualizado

A captura de tela abaixo mostra as etapas e a confirmação de timedatectl

insira a descrição da imagem aqui

Sergiy Kolodyazhnyy
fonte
é bom entender o que está acontecendo atrás da cortina, mas você não acha que seria melhor sugerir as ferramentas designadas para isso, como dpkg-reconfigure tzdata etc.?
Patrick Cornelissen
@PatrickCornelissen Primeiro de tudo, já existem respostas tzdata, então sugerir a mesma coisa é inútil. Segundo, tzdatafaz praticamente o mesmo. Cabe ao usuário decidir o que prefere, para que não seja melhor nem pior - apenas a preferência de uma pessoa.
precisa saber é o seguinte
1
Bem, trabalhando "contra" as ferramentas de distribuição muitas vezes leva a problemas, então eu gostaria de evitar a sua abordagem, se possível, mas bastante justo sua solução funcionaria (atualmente)
Patrick Cornelissen
Esta solução, pelo que entendi, funciona em diferentes distribuições. Mas ainda precisa do banco de dados de fuso horário disponível no diretório / usr / share / zoneinfo. Existe uma maneira de obter o banco de dados de fuso horário sem instalar o pacote tzdata?
andho
@andho Como /var/lib/dpkg/info/tzdata.listsugere que todos os itens /usr/share/zoneinfovêm com esse pacote, eu suponho que você precisa instalar o pacote para ter todos os itens, mas, francamente, não tenho certeza, além de não estar familiarizado com o modo como isso funciona em outros distribuições. Considere fazer isso como uma pergunta no Unix e Linux e sinta-se à vontade para fazer referência a este post se desejar fornecer um contexto para a pergunta.
Sergiy Kolodyazhnyy
10

A maneira mais fácil de atualizar o fuso horário é usar sudo dpkg-reconfigure tzdata. Mas isso não é tão fácil de criar scripts.

Se você deseja definir o fuso horário explicitamente por meio de um script (por exemplo, para configurar uma VM), aqui está uma receita:

Defina uma variável para o fuso horário desejado, por exemplo, um dos

tz=Europe/London
tz=America/Anchorage
tz=Etc/GMT+6

Valores válidos são os diretórios e nomes de arquivos em /usr/share/zoneinfo.

Então simplesmente

sudo cp -vf /usr/share/zoneinfo/$tz /etc/localtime
echo $tz | sudo tee /etc/timezone

Observe que ambos /etc/localtimee /etc/timezonedevem ser consistentes.

Provavelmente agora reinicie para atualizar todos os seus serviços (por exemplo, cron).

Rick-777
fonte
-1: nunca use cppara definir / etc / localtime. / etc / localtime é um link simbólico para o arquivo correto. Se você usar cpessa alteração, irá na verdade derrotar o conteúdo de qualquer arquivo tzdata para o qual está apontando, de repente (por exemplo) o arquivo tzdata UTC contém dados de fuso horário para Europa / Londres em vez de UTC, o que é ruim (e irritante) para solucionar problemas, como eu posso dizer por experiência pessoal)
Foogod
5

Aqui está o método que eu uso, que é centrado nos EUA, pois não preciso me preocupar com fusos horários fora dos EUA.

Se eu precisar determinar o fuso horário atual, eu também:

cat /etc/timezone  

ou

sudo hwclock --show  

Eu faço então:

timedatectl set-timezone <_designation_>

Onde <_designation_>é um dos seguintes:

EUA / Leste
dos EUA / EUA Central
/ Montanha
EUA / Pacífico
EUA / Alasca
EUA / Aleutian
EUA / Arizona
EUA / Leste-Indiana
EUA / Havaí
EUA / Indiana-Starke
EUA / Michigan
EUA / Pacífico-Novo
EUA / Samoa

POR EXEMPLO:

timedatectl set-timezone US/Eastern  

Outras designações de fuso horário podem ser encontradas aqui: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones

Redblur
fonte
tzselecté uma boa maneira de obter a seqüência fuso horário
Martin Thoma
0

Você não pode fazer isso, a menos que selecione o arquivo de fuso horário que deseja corresponder a cada deslocamento de fuso horário.

Algumas respostas sugeriram o uso dos arquivos em / usr / share / zoneinfo / Etc, mas o problema é que eles são agnósticos de horário de verão.

Portanto, a menos que você escolha alguma configuração de fuso horário para corresponder a cada deslocamento ou não se preocupe com o horário de verão, não há como fazê-lo genericamente.

Alex G
fonte