2012-09-20 20 views
10

Bir Linux kabuk dosyasından Canonical Time Zone adını almanın bir yolu var mı? Örneğin, yapılandırılmış zaman dilimim PDT ise, o zaman "Amerika/Los_Angeles" almak istiyorum.Kabuk betiğine Canonical Time Zone adını alma

Yapılandırıldıysa sembolik bağlantıdan/etc/localtime alabildiğimi biliyorum, ancak tüm sunucularda yapılandırılmayabileceğinden, bunlara güvenemiyorum.
Diğer yandan, kısa zaman dilimi adını +% Z komut tarihi ile alabilirim, ancak yine de kurallı isme ihtiyacım var.

Geçerli saat diliminin standart adını almanın ya da sembolik bağlantı/etc/localtime ayarlanmamış olsa bile, tarih +% Z komutuyla alınan saat dilimini dönüştürmenin bir yolu var mı?

+1

-nick

Ben 'tane /' doğru zaman dilimine göre bir konum haritasının oluşturulmasına katkıda sadece açıklayıcı etiket iken 'PDT', bir kanonik isim daha yakın olduğunu söyleyebilirim. – chepner

+1

Bunun mümkün olduğunu düşünmüyorum; tek bir kısaltma, açık bir şekilde genişlemiş olsa bile (ör. "Pasifik Yaz Saati"), karşılık gelen çoklu TZ-veritabanı girişlerine sahip olabilir. Örneğin, PDT sadece "Amerika/Los_Angeles" değil, aynı zamanda "Amerika/Dawson", "Amerika/Ensenada", "Amerika/Sitka", "Amerika/Tijuana", "Amerika/Vancouver", "Amerika/Whitehorse" ve ABD/Pasifik’tir. (Aslında, Amerika/Los_Angeles'i istediğini belirtmemiş olsaydın, Amerika/Pasifik'i istediğini tahmin ederdim.) – ruakh

cevap

19

Bu, göründüğünden daha karmaşıktır. Çoğu linux dağılımı bunu farklı şekilde yapar, bu nedenle Olson TZ adını almak için% 100 güvenilir bir yol yoktur. Bunu kullanmak varsa,

  1. İlk çek/etc/saat dilimi: Aşağıda

    Ben geçmişte kullanmış sezgisel olduğunu./Etc/localtime Zaman dilimi veritabanının sembolik köprü ise
  2. Sonraki kontrol eğer
  3. Aksi etc/localtime

Untested/dosyayla aynı içeriğe ile zoneinfo/usr/share bir dosyayı bulmak/örnek kod: bu hızlı örneği (/ usr/share/zoneinfo içinde ararken) birden TZ isimleri verilen dosyayı maç olaya el etmediğini

if [ -f /etc/timezone ]; then 
    OLSONTZ=`cat /etc/timezone` 
elif [ -h /etc/localtime ]; then 
    OLSONTZ=`readlink /etc/localtime | sed "s/\/usr\/share\/zoneinfo\///"` 
else 
    checksum=`md5sum /etc/localtime | cut -d' ' -f1` 
    OLSONTZ=`find /usr/share/zoneinfo/ -type f -exec md5sum {} \; | grep "^$checksum" | sed "s/.*\/usr\/share\/zoneinfo\///" | head -n 1` 
fi 

echo $OLSONTZ 

Not. Uygun TZ adını belirlemek, uygulamanıza bağlı olacaktır.

+0

Tam olarak aradığım şey tam olarak değil, ama işe yarayacak. Teşekkürler :) –