Soru Python'da sistemin saat dilimi bilgisini al?


Sistemimin varsayılan zaman dilimini (PST) Python'dan almak istiyorum. Bunu yapmanın en iyi yolu nedir? Başka bir süreci unutmaktan kaçınmak istiyorum.


44
2017-07-10 17:59


Menşei




Cevaplar:


Python'a göz atın Zaman Modülü.

from time import gmtime, strftime
print(strftime("%z", gmtime()))

Pasifik Standart Saati


12
2017-07-10 18:04



Evet ama harf  Z ve küçük harf  z değiller. - SilentGhost
ama farklı çıktılar üretin. - SilentGhost
>>> zamandan içe aktarma zamanı, strftime >>> yazdırma strftime ('% z', gmtime ()) Pasifik Standart Saati >>> yazdırma strftime ('% Z', gmtime ()) Pasifik Standart Saati Katılmıyorum. - ahawker
Ayrıca check out dateutil ve tzlocal Bu yardımcı olur. % z (ve% Z), çok kullanışlı olmayan, standart olmayan, belirsiz platform bağımlı dizeler üretir. - Lennart Regebro
Linux'ta Python 2.7'de, %Z TZ kısaltması üretir. CET, süre %z örneğin ofset üretir. +0100 - vartec


Bu işe yaramalı:

import time
time.tzname

iki dizeden oluşan bir tuple döndürür: birincisi, DST dışı yerel saat diliminin adı, ikincisi de yerel DST saat diliminin adıdır.


72
2017-07-10 18:09



Bunu daha ileri almak için kullanabilirsiniz time.tzname[time.daylight] Geçerli saat diliminin adını almak için, gün ışığından yararlanma saatini hesaplar. - Dan Breen
Yine, 'time.daylight' DST'nin aktif olduğunu göstermez. Sadece DST'nin saat dilimi tarafından gözlemlenip gözlemlenmediğini gösterir. 'Time.localtime (). Tm_isdst' yi arıyorsun. - marr75
Sadece Windows kullanıcıları için eklemek için, saat dilimi değerleri "HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Time Zones" olarak tanımlandı - swdev
time.tzname yanlış bir değer döndürebilir Yerel saat diliminin geçmişte farklı kısaltmaları varsa (Python, Ocak, Temmuz veya şu andaki değerleri kullanır)tzset() zaman değeri). tzlocal Modül, belirli bir tarih için doğru tzname almak için kullanılabilir. - jfs
ismi almanın bir yolu var mı? Asya / Tahran gibi mi? - senaps


ThomasH'ın cevabında olduğu gibi bir UTC ofseti verir, ancak gün ışığından tasarruf sağlar.

>>> import time
>>> offset = time.timezone if (time.localtime().tm_isdst == 0) else time.altzone
>>> offset / 60 / 60 * -1
-9

Değeri time.timezone veya time.altzone UTC'nin batısındaki saniye cinsindendir (UTC'nin doğusundaki bölgeler negatif bir değer alır). Bu aslında nasıl hoşlandığımızın tam tersi, dolayısıyla * -1.

time.localtime().tm_isdst gün ışığından yararlanma şu anda geçerli değilse sıfır olacaktır (bir alan yakın zamanda gün ışığından yararlanma yasasını değiştirmişse bu doğru olmayabilir).

EDIT: marr75 doğru, cevabı buna göre düzenledim.


22
2018-06-01 17:44



Güvende olmak için, ofset kontrolünün tersine çevrilmesinin gerektiğini düşünüyorum (eğer dst = 1 tane daha zaman dilimi varsa). DST durumu bir şekilde bilinmiyorsa, tm_isdstolacak -1ve geçerli kod altzone bu durumda. DST kullanmayan bölgeler için bu değer asla doğru değil. timezone muhtemelen geri dönüş olmalı. (Emin değilim -1 aslında çıkış mümkün localtime gerçi) - nmclean
Bazı kenar durumlarda tüm alt bölge, saat dilimi tabanlı çözüm başarısız olabilir - jfs


Ofsetin hesaplanması için kod parçacıkları yanlıştır, bkz. http://bugs.python.org/issue7229.

Bunu işlemenin doğru yolu:

def local_time_offset(t=None):
    """Return offset of local zone from GMT, either at present or at time t."""
    # python2.3 localtime() can't take None
    if t is None:
        t = time.time()

    if time.localtime(t).tm_isdst and time.daylight:
        return -time.altzone
    else:
        return -time.timezone

Bu, OP'nin sorduğu kesin bir soru değil, tam olarak bir ihtimaldir, ancak sayfada iki yanlış parçacığı vardır ve zaman hataları izlemek ve düzeltmek için emilir.


10
2017-11-15 21:11



1. eğer biliyorsanız tm_isdst; kontrol etmene gerek yok daylight 2. herşey altzone, timezoneBazlı durumlarda bazında çözüm başarısız olabilir - jfs


Dizeler üzerinde UTC ofsetlerini tercih ederseniz:

time.timezone / -(60*60)

4
2017-07-10 20:44



DST etkin olduğunda (/ if) yanlış hesaplanır. - marr75


Bunu iyi çalışmak için buldum:

import datetime
tz_string = datetime.datetime.now(datetime.timezone.utc).astimezone().tzname()

Benim için bu, günışığı tasarrufları arasında ayrım yapabildi.

https://stackoverflow.com/a/39079819/4549682


1
2017-07-12 03:44