Ustawianie strefy czasowej z terminala

210

Chcę zmienić strefę czasową zegara systemowego z terminala.

Można to zrobić za pomocą

tzselect

„który otwiera GUI w terminalu”

lub

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

„który ustawi na gmt”

Ale czy jest sposób, aby ustawić strefę czasową tylko z przesunięciem tj. -1 lub +5 itd.?

Muszę to zrobić, pisząc aplikację, aby dostosować limit czasu lub zgłosić dzienniki, a jedyne informacje, jakie mam, to adres IP użytkownika. Mogę użyć aplikacji internetowej, aby znaleźć lokalizację adresu IP, ale potem muszę ustawić przesunięcie, co byłoby łatwe JEŚLI mógłbym po prostu uzyskać przesunięcie lokalizacji, ale jeśli muszę znaleźć strefę i miasto, to byłby prawdziwy ból .

Jeśli ktoś zna odpowiedź na pytanie, jak ustawić zegar systemowy z godziną +/-, byłoby świetnie.

użytkownik2155009
źródło
Pomóż nam odebrać zaakceptowaną odpowiedź. Myślę, że odpowiedź @ Mitcha jest najlepsza askubuntu.com/a/323163/22308
Nam G VU
1
@NamGVU Nie, Mitch nie jest najlepszym rozwiązaniem, to odpowiedź „GUI w terminalu”. Nawet OP powiedział: „to nie zadziała, ponieważ muszę zmienić strefę czasową z programu bez danych wejściowych użytkownika, potrzebuję polecenia, które mogę wprowadzić do terminalu, a nie rozwiązania GUI” , i to jest ten sam cel, którego większość chciałaby, szukając „rozwiązania terminala, „przyjazny skryptom. Collin Anderson's jest lepszy, jeśli znasz miasto lub Ryana dla zwykłego GMT + -n
Xen2050
W Ubuntu 18.04, tzselect nie otwiera GUI. Ma wybór menu na terminalu.
Tim Richardson,

Odpowiedzi:

321

Aby zmienić strefę czasową z terminala, wystarczy nacisnąć Ctrl+ Alt+ Tna klawiaturze, aby otworzyć terminal. Kiedy się otworzy, uruchom poniższe polecenia:

sudo dpkg-reconfigure tzdata

Po otwarciu postępuj zgodnie z ekranami, aby zmienić strefę czasową.

Mitch
źródło
14
to nie zadziała, ponieważ muszę zmienić strefę czasową z programu bez danych wejściowych użytkownika. Potrzebuję polecenia, które mogę
przekazać
1
dzięki!!! to pomaga, ale jestem już ręcznie zmieniony etc / timezone =) jak php.net/manual/en/timezones.php !!! absolutnie identyczne !!!
Vladimir Ch,
Ponowna konfiguracja tzdata wydaje się również regulować zegar sprzętowy, aby wyświetlany czas pozostał taki sam po przełączeniu strefy czasowej. Możesz tego chcieć, jeśli Twój czas był prawidłowy, ale strefa czasowa była nieprawidłowa. Jednak zdecydowanie nie chcesz dotykać zegara sprzętowego podczas podróży. Podejście timedatectl wydaje się tylko do zmiany strefy czasowej.
SnakE
@SnakE dla mnie wyświetlało zmiany czasu odpowiednio
RiaD
bez problemu zmieniłem go z kitu z linii komandowej, dlaczego powiedziałeś, że mój przyjaciel? @ADTC
sabre tabatabaee yazdi
170

Możesz także użyć nowego, timedatectlaby ustawić czas w 14.04.

sudo timedatectl set-timezone America/New_York
Collin Anderson
źródło
Jak zainstalować go na Ubuntu?
Podział przez zero
1
Jest instalowany domyślnie 14.04.
Collin Anderson
6
Aby zobaczyć wszystkie dostępne opcje, możesz uruchomić ls -R --group-directories-first /usr/share/zoneinfo. (Uważaj, aby nie modyfikować ani nie usuwać tutaj żadnego pliku.) Więcej informacji na temat posixi rightprefiksów znajduje się tutaj .
ADTC
To działa! ...
Dan Nissenbaum
3
Użyj sudo timedatectl set-timezone Etc/UTCdla UTC.
Zoltán
19

Możesz użyć plików GMT ± x w /usr/share/zoneinfo/Etc.

sudo ln -fs /usr/share/zoneinfo/Etc/GMT$offset /etc/localtime
Ry-
źródło
dzięki, dziękuję za odpowiedź im otrzymuję błąd ln: nie udało się utworzyć dowiązania symbolicznego `/ etc / localtime ': Plik istnieje oboiusly, nie jestem pewien, co robię, czy znasz dobry samouczek dla tego, a nawet niektórych słów kluczowych, mogę google, dziękuję używasz polecenia poprawnie? używam sudo ln / usr / share / zoneinfo / Etc / GMT $ + 1 / etc / localtime, aby ustawić zegar na + 1gmt
user2155009
9
minitech zapomniał flagi siłowej Chyba tak -> sudo ln -sf ....
Tele
1
To zadziała, ale nie zaktualizuje nazwy tz w /etc/timezone.
poolie
1
Aby zaktualizować strefę czasową / etc /, uruchomsudo dpkg-reconfigure --frontend noninteractive tzdata
Pierre Gramme
17

Zdaję sobie sprawę, że ten wątek jest nieco przestarzały, ale szukałem lepszego rozwiązania, ponieważ musiałem automatycznie ustawić strefę czasową na maszynie wirtualnej po tym, jak użytkownik pobierze ją z naszej witryny i wdroży. Oto, z czym skończyłem:

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"

Spowoduje to wysłanie zapytania do geoip.ubuntu.com z serwera po uruchomieniu go w nowej sieci (mój skrypt najpierw sprawdza łączność), a następnie ustawi strefę czasową serwera na podstawie odpowiedzi.

„Wget -q0 -” mówi wgetowi, aby wyświetlał tylko wyniki na standardowe wyjście, które jest następnie przesyłane do zmiennej $ tz.

Mam nadzieję, że to komuś pomaga!

Clayton Dukes
źródło
1
Wspaniały! W Ubuntu 16.04 powinna to być „strefa grep” i „wydrukuj 3 $”.
user334639,
Proponuję inne CLI dla uzyskania strefy czasowej. Trochę czystsze moim zdaniem: curl -s ' geoip.ubuntu.com/lookup ' | xmllint --xpath '/ Response / TimeZone / text ()' -
Darko Miletic
11

TL; DR /etc/localtime jest dowiązaniem symbolicznym, które wskazuje na plik w /usr/share/zoneinfo/Continent/City. Zmieniając punkt, w którym wskazuje, możesz zmienić strefę czasową.

Aby zmienić strefę czasową, usuń /etc/localtimei przypisz symboliczne łącze do wybranego miasta. Na przykład ls -l /etc/localtimeraporty, które wskazuje ten plik /usr/share/zoneinfo/America/Denver. Zmieniam to na Nowy Jork

  1. sudo rm /etc/localtime
  2. sudo ln -s /usr/share/zoneinfo/America/New_York /etc/localtime
  3. Zaczekaj minutę, aż mój zegar się zaktualizuje

Poniższy zrzut ekranu pokazuje kroki i potwierdzenie od timedatectl

wprowadź opis zdjęcia tutaj

Sergiy Kolodyazhnyy
źródło
dobrze jest zrozumieć, co dzieje się za kurtyną, ale czy nie uważasz, że lepiej byłoby zasugerować wyznaczone narzędzia do tego typu, takie jak dpkg-rekonfiguruj tzdata itp.?
Patrick Cornelissen,
@PatrickCornelissen Po pierwsze, są już odpowiedzi na pytania tzdata, więc sugerowanie tego samego nie ma sensu. Po drugie, tzdatarobi prawie to samo. To użytkownik decyduje, co preferuje, więc nie jest ani lepszy, ani gorszy - tylko preferencje danej osoby.
Sergiy Kolodyazhnyy
1
No cóż, działanie „przeciw” narzędziom dystrybucji często prowadzi do problemów, więc jeśli to możliwe, unikałbym twojego podejścia, ale wystarczająco sprawiedliwe, by twoje rozwiązanie działało (obecnie)
Patrick Cornelissen
Rozumiem, że to rozwiązanie działa w różnych dystrybucjach. Ale nadal potrzebuje bazy danych strefy czasowej dostępnej w katalogu / usr / share / zoneinfo. Czy istnieje sposób na uzyskanie bazy danych strefy czasowej bez instalowania pakietu tzdata?
andho
@ andho Ponieważ /var/lib/dpkg/info/tzdata.listsugeruje, że wszystkie elementy /usr/share/zoneinfopochodzą z tego pakietu, zakładam, że musisz zainstalować pakiet, aby mieć wszystkie elementy, ale szczerze mówiąc, nie jestem do końca pewien, a ponadto nie do końca wiem, jak to działa na innych dystrybucje. Rozważ zadanie tego pytania jako pytania w systemach Unix i Linux. Jeśli chcesz podać kontekst pytania, skorzystaj z tego postu.
Sergiy Kolodyazhnyy
10

Najłatwiejszym sposobem aktualizacji strefy czasowej jest użycie sudo dpkg-reconfigure tzdata. Ale to nie jest tak łatwe do napisania.

Jeśli chcesz jawnie ustawić strefę czasową za pomocą skryptu (np. Do konfiguracji maszyny wirtualnej), oto przepis:

Ustaw zmienną dla wybranej strefy czasowej, np. Jedną z

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

Prawidłowe wartości to katalogi i nazwy plików w obszarze /usr/share/zoneinfo.

Więc po prostu

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

Należy zauważyć, że zarówno /etc/localtimei /etc/timezonemuszą być spójne.

Prawdopodobnie teraz uruchom ponownie komputer, aby zaktualizować wszystkie usługi (np. Cron).

Rick-777
źródło
-1: Nigdy nie używaj cpdo ustawiania / etc / localtime. / etc / localtime to dowiązanie symboliczne do poprawnego pliku. Jeśli użyjesz go cpdo zmiany, faktycznie zablokujesz zawartość dowolnego pliku tzdata, na który obecnie wskazuje, więc nagle (na przykład) plik tzdata UTC zawiera dane strefy czasowej dla Europy / Londynu zamiast dla UTC, co jest złe (i irytujące) do rozwiązywania problemów, jak mogę powiedzieć z własnego doświadczenia)
Foogod,
5

Oto metoda, której używam, która koncentruje się na Stanach Zjednoczonych, ponieważ nie muszę się martwić o strefy czasowe poza USA.

Jeśli muszę określić bieżącą strefę czasową, albo:

cat /etc/timezone  

lub

sudo hwclock --show  

Następnie wykonuję:

timedatectl set-timezone <_designation_>

gdzie <_designation_>jest jedna z następujących czynności:

US / Eastern
US / Central
US / Mountain
US / Pacific
US / Alaska
US / Aleutian
US / Arizona
US / East-Indiana
US / Hawaii
US / Indiana-Starke
US / Michigan
US / Pacific-New
US / Samoa

NA PRZYKŁAD:

timedatectl set-timezone US/Eastern  

Inne oznaczenia stref czasowych można znaleźć tutaj: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones

Redblur
źródło
tzselectto dobry sposób na uzyskanie ciągu strefy czasowej
Martin Thoma
0

Nie możesz tego zrobić, chyba że wybierzesz plik strefy czasowej, który chcesz dopasować do każdego przesunięcia strefy czasowej.

Niektóre odpowiedzi sugerowały użycie plików w / usr / share / zoneinfo / Etc, ale problem z nimi polega na tym, że są one niezależne od DST.

Tak więc, chyba że wybierzesz konfigurację strefy czasowej pasującą do każdego przesunięcia lub nie przejmujesz się czasem letnim, nie ma sposobu, aby to zrobić ogólnie.

Alex G.
źródło