Pytz Timezones'in bir listesi var mı?


659

Python kütüphanesi pytz zaman dilimi argümanı için olası tüm değerleri bilmek istiyorum. Nasıl yapılır?


6
"GMT", "GMT + 0", "GMT-0", "GMT0", "Greenwich", "UCT", "UTC", "Universal" ve "Zulu" kelimelerinin aslında aynı anlama gelmesi ve ama bunun için çok fazla giriş var.
Joe Z.

42
GMT, UTC ile aynı değildir. Bu yaygın bir hatadır.
PawelRoman

1
@PawelRoman: GMT farklı bir bağlamda farklı şeyler ifade edebilir. Bu does bazen örneğin ortalama UTC, böyle kabul ettiği ssl sertifikası zaman dizeleri gerektirir GMT ( eski). ssl.cert_time_to_second() ASN1_TIME_print()
jfs

3
@PawelRoman, birinin saat dilimi ve diğerinin standart olduğu anlamında haklısınız. Ancak çoğu insanın düşündüğü pratik anlamda, her ikisi de aynı anı ifade eder.
soymak

Yanıtlar:


318

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

9
Buna ek olarak all_timezones, pytz da sağlar common_timezones .
Mark Hildreth

3
Çin neden kayıp?
Adders

4
Çin , saat dilimi adı olan tek bir saat dilimi kullanıyor 'Asia/Shanghai'.
unutbu

1
Bu ifade pytz'un verebileceği korkunç sonucu gösterir: (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.
Yongwei Wu

2
@YongweiWu yanlış bir API kullanımı. Doğrudan tzinfo argümanı olarak sabit olmayan bir utc ofsetine sahip bir pytz saat dilimini geçmemelisiniz. Pytz belgelerinin önerdiği gibi .localize () yöntemini kullanın.
jfs

38

Kendi listenizi oluşturma - pytzyerleş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 datetimenesne 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

27

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.


14

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.



4

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 datetimeonun için localizeyö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.


2
Düzeltme için stackoverflow.com/questions/11473721/… adresine bakın . Yanlış bir şey yok pytz, sadece yanlış kullanıyorsunuz. PS Bu soruya bir cevap değildir hiç .
Mark Ransom

1
@MarkRansom İyi bilgi ve bilmek güzel. Ancak argümanınızı almıyorum. Arayüz yanlış tasarlanmış, nokta. Çok mantıksız.
Yongwei Wu

3
Evet, arayüz yanlış tasarlanmış. Ama datetimeyanlış olan arayüz bu değil pytz. akıllı saat dilimi nesnelerini datetimebeklemediğinden , arayüzü onları doğru şekilde başlatmaz.
Mark Ransom

1
Saygılarımla, katılmıyorum. datetimestandart Python kütüphanesinin bir parçasıdır ve datetimearayü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ı.
Yongwei Wu

2
Söylediğim gibi, arayüz eksik olduğu için arayüzü pytztakip 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. datetimedatetime
Mark Ransom

-8

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.


12
Ofsetler yıl boyunca değişir (genellikle yaz saati uygulaması nedeniyle), bu normalde saat dilimi olarak düşündüğümüzle aynı değildir.
Ryan Hiebert

Seçilen sözdizimi, tzdata'daki tanımlara dayanmaktadır .
Brad Koch
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.