Jak sprawdzić, która strefa czasowa w systemie Linux?

129

Czy istnieje sposób sprawdzenia, w której strefie czasowej aktualnie jestem w systemie Linux?

Peter Mortensen
źródło

Odpowiedzi:

19

Zwykle TZzmienna środowiskowa powie ci coś pożytecznego. Jednak najlepiej jest używać takich funkcji, jak mktime()i localtime()konwertować między time_toraz reprezentację lokalnej strefy czasowej. Oznacza to, że nie próbuj dokonywać konwersji samodzielnie .

Greg Hewgill
źródło
2
czy jest jakieś polecenie, które mówi o strefie czasowej użytkownika?
26
Jasne, datepowiem ci.
Greg Hewgill,
Mam dwie instancje serwera, jeśli podam komendę „data” na obu serwerach, to pokaże inną godzinę. strefa czasowa dla obu serwerów to IST, czas jednego serwera: pon. 11 lipca 10:39:31 IST 2011 i drugiego serwera pon. lip 11 10:35:31 IST 2011 .. różnica wynosi 4 minuty
8
Na Precise Pangolin echo $TZnic mi nie zwraca.
Iain Samuel McLean Starszy
3
@GregHewgill twoja odpowiedź nie jest pomocna przy pierwszym wyświetleniu. Proszę rozważyć edycję odpowiedzi. Zobacz najczęściej głosowaną odpowiedź poniżej. Na razie będę głosować za odpowiedzią. Poza tym na moich komputerach nie ma domyślnie TZ env.
therealmarv
244

Jeśli masz na myśli z konsoli, po prostu wpisz:

date +%Z
Rasman
źródło
2
dobrze, działa dobrze.
Silver Moon,
15
to powinna być zaakceptowana odpowiedź
KalenGi
dobra uwaga ... zmieniłem odpowiedź na ten efekt
Rasman
Aby ustawić strefę czasową z wiersza poleceń w systemie Ubuntu, poniższe łącze zawiera trywialne, 1-wierszowe polecenie: askubuntu.com/a/524362/182454
Dan Nissenbaum,
To daje +07mi. Aby uzyskać dostęp Region/Citydo systemu Linux opartego na Debian / Arch, zobacz tę odpowiedź .
Tom Hale,
54

Jeśli chcesz numeryczną strefę czasową:

date +'%:z %Z'

Przykładowe dane wyjściowe:

-05:00 EST
Paul Vargas
źródło
7
W systemie OS X to wyjście:z EST
podejrzenie
7
To jeśli dla Linuksa .
Paul Vargas
1
Dokładniej, dotyczy to GNU date. Wersja BusyBox drukuje coś nie sensownego, w moim przypadku „%: z CEST”.
Léo Lam
Jednak data +% z działa dobrze w systemie OS X. Sugeruję zmodyfikowanie odpowiedzi.
Neil Mayhew
1
Cześć, @NeilMayhew Dzięki! Humm ... ale pytanie ma tagilinux ubuntu-10.04
Paul Vargas
24

Zamiast tego chciałem znaleźć strefę czasową w formie „US / Eastern” lub „Europe / London”. Możesz to znaleźć w:

  • / etc / timezone (obecny na Ubuntu i Red Hat? ale nie np. Amazon Linux)
  • (w systemach w stylu Red Hat) jak ZONE="US/Eastern"w / etc / sysconfig / clock
  • lub możesz spróbować dopasować / etc / localtime do jednego z plików w katalogu / usr / share / zoneinfo; denerwująco nie wydaje się to dowiązaniem symbolicznym, ale możesz np

    cd / usr / share / zoneinfo
    find * -type f -exec sh -c "diff -q / etc / localtime '{}'> / dev / null && echo {}" \;

    znaleźć pasujące pliki - prawdopodobnie są na to lepsze sposoby, ale to działa. Będzie wiele dopasowań.

Rup
źródło
4
find /usr/share/zoneinfo/ -type f| xargs md5sum | grep $(md5sum /etc/localtime | cut -d' ' -f1)
freiheit
6

Czasami możesz szukać kanonicznej strefy czasowej, a nie krótkiej formy utworzonej date %Znp US/Eastern. Przez . W systemach z timedatectlnp. Fedorą timedatectlwyświetla wiele użytecznych informacji, w tym bieżącą strefę:

# timedatectl
      Local time: Tue 2016-09-13 17:10:26 EDT
  Universal time: Tue 2016-09-13 21:10:26 UTC
        RTC time: Tue 2016-09-13 21:10:26
       Time zone: US/Eastern (EDT, -0400)
 Network time on: yes
NTP synchronized: yes
 RTC in local TZ: no

Niestety timedatectlprzyjmuje set-timezonejako polecenie, ale nie ma odpowiadającego get-timezone. Analizuj w następujący sposób:

# timedatectl status | grep "zone" | sed -e 's/^[ ]*Time zone: \(.*\) (.*)$/\1/g'`
US/Eastern
Raman
źródło
4
$ strings /etc/localtime | tail -n 1
MST7MDT,M3.2.0,M11.1.0

Więc jestem na czas górski. Chociaż powyższe porady dotyczące używania zmiennej środowiskowej lub po prostu danych wyjściowych polecenia date czasami działają lepiej, w zależności od tego, jak chcesz tego użyć.

Tagar
źródło
2
  • / etc / sysconfig / clock ustawia, czy zegar sprzętowy jest zapisywany jako czas UTC czy czas lokalny.
  • Symlink / etc / localtime to / usr / share / zoneinfo / ... aby ustawić strefę czasową.
  • Wpisz, /sbin/hwclock --systohc [--utc]aby ustawić zegar sprzętowy.

Jądro Linux zawsze przechowuje i oblicza czas jako liczbę sekund od północy 1 stycznia 1970 roku UTC, niezależnie od tego, czy zegar sprzętowy jest zapisany jako UTC, czy nie. Konwersje na czas lokalny są wykonywane w czasie wykonywania. Jedną fajną rzeczą jest to, że jeśli ktoś używa twojego komputera z innej strefy czasowej, może ustawić zmienną środowiskową TZ, a wszystkie daty i godziny będą wyświetlane poprawnie dla swojej strefy czasowej.

Jeśli liczba sekund od 1 stycznia 1970 r. UTC jest przechowywana jako 32-bitowa liczba całkowita ze znakiem (tak jak w systemie Linux / Intel), Twój zegar przestanie działać w roku 2038. Linux nie ma nieodłącznego problemu z Y2K , ale ma problem z rokiem 2038. Mamy nadzieję, że do tego czasu wszyscy będziemy używać Linuksa na systemach 64-bitowych. 64-bitowe liczby całkowite utrzymają nasze zegary całkiem dobrze do około 292271 milionów lat.

Rup
źródło
1

Kilka rozwiązań:

date +"%Z %z"
timedatectl | grep "Time zone"
cat /etc/timezone

dał mi (odpowiednio):

UTC +0000
Time zone: Etc/UTC (UTC, +0000)
Etc/UTC

Mój komputer jest na UTC.

tika
źródło
0

Użycie TZ lub daty NIE JEST NIEZAWODNE, ponieważ informuje o strefie czasowej UŻYTKOWNIKA, a nie o domyślnej systemowej strefie czasowej.

Domyślna systemowa strefa czasowa jest przechowywana w / etc / timezone (która często jest symbolicznym łączem do pliku danych strefy czasowej specyficznego dla strefy czasowej). Jeśli nie masz / etc / timezone, spójrz na / etc / localtime. Ogólnie jest to strefa czasowa „serwera”. / etc / localtime jest często dowiązaniem symbolicznym do pliku strefy czasowej w / usr / share / zoneinfo. Ścieżka do odpowiedniego pliku strefy czasowej często zawiera również informacje geograficzne.

Nowszy linux ma „timedatectl”, który daje mnóstwo informacji, gdy polecenie jest uruchomione.

(jako węzeł boczny, jeśli masz starożytny system, który wciąż korzysta ze starych zakodowanych stref czasowych, prawdopodobnie możesz skopiować na niego nowoczesny plik strefy czasowej i będzie on działał. Musiałem to robić wiele razy, aby rozwiązać problem zmiany stref czasowych na starszym sprzęcie).

TekOps
źródło
0

Czasami timedatectl set-timezonesię nie aktualizuje/etc/timezone , dlatego najlepiej jest pobrać strefę nazw z pliku, na który /etc/timezonewskazuje dowiązanie symboliczne :

#!/bin/bash
set -euo pipefail

if filename=$(readlink /etc/localtime); then
    # /etc/localtime is a symlink as expected
    timezone=${filename#*zoneinfo/}
    if [[ $timezone = "$filename" || ! $timezone =~ ^[^/]+/[^/]+$ ]]; then
        # not pointing to expected location or not Region/City
        >&2 echo "$filename points to an unexpected location"
        exit 1
    fi
    echo "$timezone"
else  # compare files by contents
    # https://stackoverflow.com/questions/12521114/getting-the-canonical-time-zone-name-in-shell-script#comment88637393_12523283
    find /usr/share/zoneinfo -type f ! -regex ".*/Etc/.*" -exec \
        cmp -s {} /etc/localtime \; -print | sed -e 's@.*/zoneinfo/@@' | head -n1
fi

Odniesienia: w tej odpowiedzi .

Tom Hale
źródło
0

Możesz jednocześnie wyświetlić datę i strefę czasową:

date +'%d/%m/%Y  %H:%M:%S [%:z  %Z]'
Mohsen Abasi
źródło