Linux'ta hangi saat diliminin kontrolü nasıl yapılır?


Yanıtlar:


19

Genellikle, TZortam değişkeni size faydalı bir şey söyleyecektir. Ancak, gibi fonksiyonları kullanmak en iyisidir mktime()ve localtime()aralarında dönüştürmek time_tve yerel bir saat dilimi gösterimi. Yani, dönüşümü kendiniz yapmaya çalışmayın .


2
içinde bulunduğu saat dilimini söyleyen herhangi bir Komut var mı?

26
Tabii ki datesana söyleyeceğim.
Greg Hewgill

iki sunucu örneğim var, her iki sunucuda da "tarih" komutu verirseniz farklı zamanlar gösterir. Her iki sunucu için saat dilimi IST, bir sunucunun saati: Pzt 11 Tem 10 10:39:31 IST 2011 ve diğer sunucu Pzt 11 10:35:31 IST 2011 .. 4 dakika fark var

8
Kesin olarak Pangolin echo $TZbenim için hiçbir şey döndürmez.
Iain Samuel McLean Elder

3
@GregHewgill cevabınız ilk bakışta yardımcı değildir. Lütfen cevabınızı düzenlemeyi düşünün lütfen. Aşağıdaki en çok oy alan cevaba bakınız. Şimdilik cevabınızı düşüreceğim. Ayrıca makinelerimde varsayılan olarak TZ env yok.
therealmarv

244

Konsoldan demek istiyorsan, sadece şunu yaz:

date +%Z

2
iyi, iyi çalışıyor.
Silver Moon

15
bu kabul edilen cevap olmalıdır
KalenGi

iyi nokta ... bu etkinin cevabı değişti
Rasman

Ve saat dilimini Ubuntu'daki komut satırından ayarlamak için aşağıdaki bağlantı önemsiz, 1 satırlık komutu sağlar: askubuntu.com/a/524362/182454
Dan Nissenbaum

Bu +07benim için veriyor . Almak için Region/Citybir Debian / Arch tabanlı Linux üzerinde, bkz bu cevabı .
Tom Hale

54

Sayısal saat dilimini istiyorsanız:

date +'%:z %Z'

Örnek çıktı:

-05:00 EST

7
OS X'te bu çıktılar:z EST
şüpheli

7
Linux için eğer .
Paul Vargas,

1
Daha doğrusu, bu GNU için geçerlidir date. BusyBox sürümü benim durumumda "%: z CEST" gibi bir şey ifade etmiyor.
Léo Lam,

Ancak, OS + 'da tarih +% z düzgün çalışıyor. Cevabı değiştirmenizi öneririm.
Neil Mayhew

1
Merhaba, @NeilMayhew Teşekkürler! Humm ... ama soru etiketleri varlinux ubuntu-10.04
Paul Vargas

24

Saat dilimini "ABD / Doğu" veya "Avrupa / Londra" biçiminde bulmak istedim. Bunu içinde bulabilirsiniz:

  • / etc / timezone (Ubuntu ve Red Hat'ta mevcut mu? ama örneğin Amazon Linux'ta değil)
  • (Red Hat tarzı sistemlerde) ZONE="US/Eastern"/ etc / sysconfig / clock içinde
  • veya / etc / localtime dosyasını / usr / share / zoneinfo altındaki dosyalardan biriyle eşleştirip deneyebilirsiniz; can sıkıcı bir şekilde, bu bir sembolik bağlantı gibi görünmüyor, ancak örneğin

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

    eşleşen dosyaları bulmak için - muhtemelen bunu yapmanın daha iyi yolları vardır, ancak bu işe yarar. Birden fazla eşleşme olacak.


4
find /usr/share/zoneinfo/ -type f| xargs md5sum | grep $(md5sum /etc/localtime | cut -d' ' -f1)
freiheit


6

Bazen, date %Zörn US/Eastern. Tarafından üretilen kısa biçimden ziyade kanonik saat dilimini arıyor olabilirsiniz . timedatectlÖrneğin Fedora'ya sahip sistemlerde timedatectl, geçerli bölge de dahil olmak üzere birçok yararlı bilgi verir:

# 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

Maalesef, komut olarak timedatectlalır set-timezone, ancak buna karşılık gelmez get-timezone. Aşağıdaki gibi ayrıştırın:

# timedatectl status | grep "zone" | sed -e 's/^[ ]*Time zone: \(.*\) (.*)$/\1/g'`
US/Eastern

4
$ strings /etc/localtime | tail -n 1
MST7MDT,M3.2.0,M11.1.0

Yani ben Dağ Saati'ndeyim. Her ne kadar yukarıdaki ortam değişkenini ya da sadece tarih komut çıktısını kullanma önerileri, nasıl kullanmak istediğinize bağlı olarak bazen daha iyi sonuç verir.



2
  • / etc / sysconfig / clock, donanım saatinin UTC olarak mı yoksa yerel saat olarak mı depolanacağını ayarlar.
  • Saat diliminizi ayarlamak için / link / etc / localtime / usr / share / zoneinfo / ... dizinine gidin.
  • Tür /sbin/hwclock --systohc [--utc]donanım saatini ayarlamak için.

Linux çekirdeği, donanım saatinizin UTC olarak depolanıp depolanmadığına bakılmaksızın, 1 Ocak 1970 UTC'nin gece yarısından itibaren geçen zamanı saniye olarak saklar ve hesaplar. Yerel saatinize dönüşümler çalışma zamanında yapılır. Bununla ilgili güzel bir şey, birinin bilgisayarınızı farklı bir saat diliminden kullanıyor olması durumunda, TZ ortam değişkenini ayarlayabilmeleri ve tüm tarih ve saatlerin saat dilimleri için doğru görünmeleridir.

UTC'nin 1 Ocak 1970’ten bu yana geçen saniye sayısı işaretli bir 32 bit tam sayı olarak saklanırsa (Linux / Intel sisteminizde olduğu gibi), saatiniz 2038 yılında bir süre çalışmayı durduracaktır. Linux'un doğal Y2K sorunu yok , ancak bir yıl 2038 sorunu var. Umarım o zamanlar hepimiz 64-bit sistemlerde Linux kullanıyor olacağız. 64-bit tamsayılar, saatlerimizin yaklaşık 292271 milyon olana kadar oldukça iyi çalışmasını sağlayacak.


1

Birkaç çözüm:

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

(sırasıyla) bana verdi:

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

Bilgisayarım UTC'de.


0

TZ veya tarih kullanımı GÜVENİLİR DEĞİL çünkü varsayılan sistem saat dilimini değil, KULLANICI saat dilimini gösterir.

Varsayılan sistem saat dilimi / etc / timezone dizininde saklanır (bu genellikle saat dilimine özgü saat dilimi veri dosyasına sembolik bir bağlantıdır). Eğer bir / etc / timeezone yoksa, / etc / localtime 'ye bakınız. Genellikle bu "sunucunun" saat dilimidir. / etc / localtime genellikle / usr / share / zoneinfo dosyasındaki bir saat dilimine bir bağlantıdır. Doğru saat dilimi dosyasına giden yol genellikle size coğrafi bilgileri de verecektir.

Daha yeni linux, komut çalıştırıldığında size tonlarca bilgi veren "timedatectl" dosyasına sahiptir.

(yan düğüm olarak, hala ESKİ sabit kodlanmış saat dilimlerini kullanan eski bir sisteminiz varsa, muhtemelen üzerine modern bir saat dilimi dosyasını kopyalayabilirsiniz ve çalışacaktır. Değişen saat dilimlerini çözmek için bunu birçok kez yapmak zorunda kaldım. eski cihazlarda).


0

Bazen timedatectl set-timezonegüncelleme yapmaz/etc/timezone , bu nedenle sembolik dizinin işaret ettiği dosyanın adından tiemzonu bulmak en iyisidir /etc/timezone:

#!/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

Kaynaklar: bu cevapta .


0

Tarihi ve saat dilimini aynı anda gösterebilirsiniz:

date +'%d/%m/%Y  %H:%M:%S [%:z  %Z]'
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.