Python kütüphanesi pytz zaman dilimi argümanı için olası tüm değerleri bilmek istiyorum. Nasıl yapılır?
ssl.cert_time_to_second()
ASN1_TIME_print()
Python kütüphanesi pytz zaman dilimi argümanı için olası tüm değerleri bilmek istiyorum. Nasıl yapılır?
ssl.cert_time_to_second()
ASN1_TIME_print()
Yanıtlar:
Mevcut tüm zaman dilimlerini aşağıdakilerle listeleyebilirsiniz pytz.all_timezones
:
In [40]: import pytz
In [41]: pytz.all_timezones
Out[42]:
['Africa/Abidjan',
'Africa/Accra',
'Africa/Addis_Ababa',
...]
Ayrıca pytz.common_timezones
:
In [45]: len(pytz.common_timezones)
Out[45]: 403
In [46]: len(pytz.all_timezones)
Out[46]: 563
'Asia/Shanghai'
.
(datetime(2017,2,13,14,29,29, tzinfo=pytz.timezone('Asia/Shanghai')) - datetime(2017,2,13,14,29,29, tzinfo=pytz.timezone('UTC'))).total_seconds()
(sonuç -28800 değil ). Pytz—dateutil.tz benzer işlevler sağlar ancak işletim sistemi saat dilimi veritabanını kullanır ve böyle bir sorun yok.
Kendi listenizi oluşturma - pytz
yerleşik bir kümeye sahiptir:
import pytz
set(pytz.all_timezones_set)
>>> {'Europe/Vienna', 'America/New_York', 'America/Argentina/Salta',..}
Daha sonra bir saat dilimi uygulayabilirsiniz :
import datetime
tz = pytz.timezone('Pacific/Johnston')
ct = datetime.datetime.now(tz=tz)
>>> ct.isoformat()
2017-01-13T11:29:22.601991-05:00
Ya zaten bir varsa datetime
nesne olduğunu TZ farkında (saf değil):
# This timestamp is in UTC
my_ct = datetime.datetime.now(tz=pytz.UTC)
# Now convert it to another timezone
new_ct = my_ct.astimezone(tz)
>>> new_ct.isoformat()
2017-01-13T11:29:22.601991-05:00
Saat dilimi adı, saat dilimini belirtmenin tek güvenilir yoludur.
Saat dilimi adlarının bir listesini burada bulabilirsiniz: http://en.wikipedia.org/wiki/List_of_tz_database_time_zones Bu listenin Amerika / New_York olarak adlandırılan saat dilimi için ABD / Doğu gibi birçok diğer ad içerdiğini unutmayın.
Programlı olarak zoneinfo veritabanından bu listeyi oluşturmak istiyorsanız, listeyi zoneinfo veritabanındaki zone.tab dosyasından derleyebilirsiniz. Ben pytz onları almak için bir API olduğunu sanmıyorum, ve ben de çok yararlı olacağını düşünmüyorum.
Burada, Python ülke kodları, isimleri, kıtaları, başkentleri ve pytz zaman dilimleri listesi.
countries = [
{'timezones': ['Europe/Paris'], 'code': 'FR', 'continent': 'Europe', 'name': 'France', 'capital': 'Paris'}
{'timezones': ['Africa/Kampala'], 'code': 'UG', 'continent': 'Africa', 'name': 'Uganda', 'capital': 'Kampala'},
{'timezones': ['Asia/Colombo'], 'code': 'LK', 'continent': 'Asia', 'name': 'Sri Lanka', 'capital': 'Sri Jayewardenepura Kotte'},
{'timezones': ['Asia/Riyadh'], 'code': 'SA', 'continent': 'Asia', 'name': 'Saudi Arabia', 'capital': 'Riyadh'},
{'timezones': ['Africa/Luanda'], 'code': 'AO', 'continent': 'Africa', 'name': 'Angola', 'capital': 'Luanda'},
{'timezones': ['Europe/Vienna'], 'code': 'AT', 'continent': 'Europe', 'name': 'Austria', 'capital': 'Vienna'},
{'timezones': ['Asia/Calcutta'], 'code': 'IN', 'continent': 'Asia', 'name': 'India', 'capital': 'New Delhi'},
{'timezones': ['Asia/Dubai'], 'code': 'AE', 'continent': 'Asia', 'name': 'United Arab Emirates', 'capital': 'Abu Dhabi'},
{'timezones': ['Europe/London'], 'code': 'GB', 'continent': 'Europe', 'name': 'United Kingdom', 'capital': 'London'},
]
Tam liste için: Gist Github
Umarım yardımcı olur.
Burada bulunan tz veritabanı saat dilimleri tarafından doldurulmuş görünüyorlar .
pytz
tz veritabanına erişim sağlar (wikipedia verilerinin kaynağıdır).
DÜZENLEME: Bu yanıtı daha da aşağı indirmezseniz sevinirim. Bu cevap yanlış , ama tarihsel bir not olarak saklamayı tercih ederim. Pytz arayüzünün hataya açık olup olmadığı tartışılabilir olsa da, dateutil.tz'nin, özellikle geçmişte veya gelecekte yaz saati uygulamasıyla yapamayacağı şeyleri yapabilir. Ben dürüstçe "Python zaman dilimleri" bir makalede deneyimlerimi kaydettik .
Unix benzeri bir platformdaysanız, pytz'dan kaçınmanızı ve / usr / share / zoneinfo'ya bakmanızı öneririm. dateutil.tz buradaki bilgileri kullanabilir.
Aşağıdaki kod parçası, pytz'ın verebileceği sorunu gösterir. İlk öğrendiğimde şok oldum. (İlginçtir, Yum tarafından CentOS 7 üzerine yüklenen pytz bu sorunu göstermez.)
import pytz
import dateutil.tz
from datetime import datetime
print((datetime(2017,2,13,14,29,29, tzinfo=pytz.timezone('Asia/Shanghai'))
- datetime(2017,2,13,14,29,29, tzinfo=pytz.timezone('UTC')))
.total_seconds())
print((datetime(2017,2,13,14,29,29, tzinfo=dateutil.tz.gettz('Asia/Shanghai'))
- datetime(2017,2,13,14,29,29, tzinfo=dateutil.tz.tzutc()))
.total_seconds())
-29160.0
-28800.0
Yani pytz tarafından oluşturulan saat dilimi, insanların gözlemlediği standart yerel saat yerine gerçek yerel saat içindir. Şangay, pytz tarafından önerildiği gibi +0806 değil, +0800'e uygundur:
pytz.timezone('Asia/Shanghai')
<DstTzInfo 'Asia/Shanghai' LMT+8:06:00 STD>
EDIT: Mark Ransom yorum ve aşağı oy sayesinde, şimdi pytz yanlış şekilde kullandığımı biliyorum. Özetle, sen sonucunu geçmesi gerekiyordu değildir pytz.timezone(…)
üzere datetime
, ancak geçmelidir datetime
onun için localize
yöntemle.
Tartışmasına rağmen (ve pytz belgelerini daha dikkatli okumadığım için kötü), bu cevabı saklayacağım. Soruyu bir şekilde cevaplıyordum (pytz ile olmasa da desteklenen zaman dilimlerini nasıl numaralandıracağım), çünkü pytz'ın doğru bir çözüm sağlamadığına inanıyordum. İnancım yanlış olsa da, bu cevap hala bazı bilgiler sağlıyor, IMHO, bu soruyla ilgilenen insanlar için potansiyel olarak yararlı. Pytz'un bir şeyleri yapmanın doğru yolu sezgiseldir. Hyt , eğer pytz tarafından oluşturulan tzinfo doğrudan kullanılmamalıysa datetime
, farklı bir tip olmalıdır. Pytz arayüzü kötü bir şekilde tasarlanmıştır. Mark tarafından sağlanan bağlantı, sadece ben değil, birçok insanın pytz arayüzü tarafından yanlış yönlendirildiğini gösteriyor.
pytz
, sadece yanlış kullanıyorsunuz. PS Bu soruya bir cevap değildir hiç .
datetime
yanlış olan arayüz bu değil pytz
. akıllı saat dilimi nesnelerini datetime
beklemediğinden , arayüzü onları doğru şekilde başlatmaz.
datetime
standart Python kütüphanesinin bir parçasıdır ve datetime
arayüzü takip etmeli , tam tersi değil. Eğer herhangi bir fikir birliği fikir birliği olmadan daha iyi düşündüğü şekilde uygulayabilseydi, sağlam bir yazılım olmazdı.
pytz
takip edemiyorum . Bu arayüzün yazarları, parametreleri yıllar içinde değişen bir zaman diliminin problemlerini öngörmüyordu. Standart Python dağıtımının bir parçası olması, mükemmel olduğu anlamına gelmez. datetime
datetime
Bence bu pytz kütüphanesinin bir tasarım hatası. Ofseti kullanarak bir saat dilimi belirtmek daha güvenilir olmalıdır, örn.
pytz.construct("UTC-07:00")
Bu size Kanada / Pasifik saat dilimini verir.