Şu anda Linux'ta hangi saat diliminde bulunduğumu kontrol etmenin bir yolu var mı?
Şu anda Linux'ta hangi saat diliminde bulunduğumu kontrol etmenin bir yolu var mı?
Yanıtlar:
Genellikle, TZ
ortam 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_t
ve yerel bir saat dilimi gösterimi. Yani, dönüşümü kendiniz yapmaya çalışmayın .
date
sana söyleyeceğim.
echo $TZ
benim için hiçbir şey döndürmez.
Konsoldan demek istiyorsan, sadece şunu yaz:
date +%Z
Sayısal saat dilimini istiyorsanız:
date +'%:z %Z'
Örnek çıktı:
-05:00 EST
:z EST
date
. BusyBox sürümü benim durumumda "%: z CEST" gibi bir şey ifade etmiyor.
linux
ubuntu-10.04
Saat dilimini "ABD / Doğu" veya "Avrupa / Londra" biçiminde bulmak istedim. Bunu içinde bulabilirsiniz:
ZONE="US/Eastern"
/ etc / sysconfig / clock içindeveya / 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.
find /usr/share/zoneinfo/ -type f| xargs md5sum | grep $(md5sum /etc/localtime | cut -d' ' -f1)
Ubuntu için şunu deneyin:
$ cat /etc/timezone
Örnek çıktı:
Asia/Kolkata
Diğer dağıtım için Referans: https://unix.stackexchange.com/questions/110522/timezone-setting-in-linux
timedatectl set-timezone
güncelleme yapmaz/etc/timezone
. Dayalı bir çözüm için bu cevaba bakınız /etc/localtime
.
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 timedatectl
alı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
Saat dilimi için coğrafi konumu kullanabilirsiniz:
$ curl https://ipapi.co/timezone
America/Chicago
Veya:
$ curl http://ip-api.com/line?fields=timezone
America/Chicago
/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.
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).
Bazen timedatectl set-timezone
gü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 .
Tarihi ve saat dilimini aynı anda gösterebilirsiniz:
date +'%d/%m/%Y %H:%M:%S [%:z %Z]'