Pytzタイムゾーンのリストはありますか?


659

Pythonライブラリpytzのtimezone引数に可能なすべての値を知りたいのですが。どうやってするの?


6
「GMT」、「GMT + 0」、「GMT-0」、「GMT0」、「グリニッジ」、「UCT」、「UTC」、「ユニバーサル」、「ズールー」はすべて基本的に同じことを意味し、まだそれのための非常に多くのエントリがあります。
Joe Z.

43
GMTはUTCと同じではありません。これはよくある間違いです。
PawelRoman、2014年

1
@PawelRoman:GMTは、異なるコンテキストでは異なることを意味します。それ 時々UTCを意味します。例えば、受け入れられたようなssl証明書の時間文字列 GMT(レガシー)を必要とします。ssl.cert_time_to_second() ASN1_TIME_print()
jfs 2014

3
@PawelRomanは、一方がタイムゾーンで、もう一方が標準であるという意味で正しいです。しかし、ほとんどの人が考える実際的な意味では、どちらも同じ瞬間を指します。
2017年

回答:


318

使用可能なすべてのタイムゾーンをリストすることができますpytz.all_timezones

In [40]: import pytz
In [41]: pytz.all_timezones
Out[42]: 
['Africa/Abidjan',
 'Africa/Accra',
 'Africa/Addis_Ababa',
 ...]

またありますpytz.common_timezones

In [45]: len(pytz.common_timezones)
Out[45]: 403

In [46]: len(pytz.all_timezones)
Out[46]: 563

9
に加えてall_timezonespytzも提供します common_timezones
Mark Hildreth、2013年

3
なぜ中国がなくなっているのですか?
加算器2017

4
中国では、タイムゾーン名がである単一のタイムゾーンを使用してい'Asia/Shanghai'ます。
unutbu 2017

1
この式は、pytzが与える恐ろしい結果を示しています(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()(結果は-28800ではありません)。pytzは避けます。dateutil.tzは同様の機能を提供しますが、OSタイムゾーンデータベースを使用し、そのような問題はありません。
Yongwei Wu

2
@YongweiWuそれは間違ったAPIの使用法です。固定されていないutcオフセットを含むpytzタイムゾーンをtzinfo引数として直接渡すべきではありません。pytzドキュメントが示唆するように.localize()メソッドを使用します。
jfs

38

独自のリストを作成しないでください - pytz組み込みのセットがあります:

import pytz
set(pytz.all_timezones_set)  
>>> {'Europe/Vienna', 'America/New_York', 'America/Argentina/Salta',..}

次に、タイムゾーンを適用できます

import datetime
tz = pytz.timezone('Pacific/Johnston')
ct = datetime.datetime.now(tz=tz)
>>> ct.isoformat()
2017-01-13T11:29:22.601991-05:00

それとも、あなたが既に持っている場合はdatetime、オブジェクトであるTZ意識を(ナイーブではありません):

# 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

タイムゾーン名は、タイムゾーンを指定する唯一の信頼できる方法です。

ここにタイムゾーン名のリストがあります。http//en.wikipedia.org/wiki/List_of_tz_database_time_zones このリストには、America / New_Yorkと正しく呼ばれるタイムゾーンのUS / Easternなど、多くのエイリアス名が含まれていることに注意してください。

プログラムでzoneinfoデータベースからこのリストを作成する場合は、zoneinfoデータベースのzone.tabファイルからリストをコンパイルできます。私はpytzがそれらを取得するためのAPIを持っているとは思いません。また、それが非常に役立つとは思いません。


14

ここでは、国コード、名前、大陸、首都、pytzタイムゾーンのPythonリストです。

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'},
]

全リスト: Gist Github

それが役に立てば幸い。



4

編集:あなたがこの回答をさらに投票しない場合は、私はそれを感謝します。この答えは間違っていますが、私はむしろそれを歴史的なメモとして残したいと思います。pytzインターフェースがエラーを起こしやすいかどうかは議論の余地がありますが、特に過去または将来の夏時間に関して、dateutil.tzができないことを行うことができます。私は「Pythonのタイムゾーン」という記事で自分の経験を正直に記録しました。


Unixライクなプラットフォームを使用している場合は、pytzを使用せずに/ usr / share / zoneinfoだけを確認することをお勧めします。dateutil.tzはそこで情報を利用できます。

次のコードは、pytzが与える問題を示しています。初めて見つけたときはショックでした。(興味深いことに、CentOS 7でyumによってインストールされたpytzではこの問題は発生しません。)

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

つまり、pytzによって作成されるタイムゾーンは、人々が観察する標準の現地時間ではなく、実際の現地時間用です。上海はpytzによって提案された+0806ではなく+0800に準拠します。

pytz.timezone('Asia/Shanghai')
<DstTzInfo 'Asia/Shanghai' LMT+8:06:00 STD>

編集: Mark Ransomのコメントと反対投票のおかげで、私はpytzを間違った方法で使用していることがわかりました。要約すると、あなたはその結果を渡すことになっていないpytz.timezone(…)datetimeが、渡す必要がありdatetime、そのにlocalizeする方法。

彼の議論(そしてpytzのドキュメントをもっと注意深く読まなかったことに対する私の悪い点)にもかかわらず、私はこの答えを続けます。私はpytzが正しい解決策を提供しないと信じていたので、質問に答えていました(サポートされているタイムゾーンを列挙する方法ですが、pytzではありません)。私の信念は間違っていましたが、この回答はまだいくつかの情報を提供しています、IMHO、それはこの質問に興味がある人々に役立つ可能性があります。ピッツの正しいやり方は直感に反しています。いや、pytzによって作成されたtzinfoがによって直接使用されるべきではない場合datetime、それは別のタイプでなければなりません。pytzインターフェースは単純にうまく設計されていません。Markが提供するリンクは、私だけでなく多くの人々がpytzインターフェースに惑わされたことを示しています。


2
修正については、stackoverflow.com / questions / 11473721 /…を参照してください。には何の問題もありませんがpytz、間違って使用しています。PSこれは、質問への答えではありませんすべてで
Mark Ransom、2018

1
@MarkRansom良い情報です。しかし、私はあなたの議論を買いません。インターフェースの設計が間違っています。それは非常に直観に反しています。
Yongwei Wu

3
はい、インターフェースは正しく設計されていません。しかしdatetime、間違っているのはインターフェースではありませんpytzdatetimeインテリジェントなタイムゾーンオブジェクトを予期していなかったため、そのインターフェースはそれらを適切に初期化しません。
Mark Ransom、2018

1
尊重して、私は同意しません。datetimeこれは標準のPythonライブラリの一部であり、datetimeインターフェースに従う必要があるのはpytzであり、その逆ではありません。誰かが合意なしでより良いと思う方法でインターフェースを実装できれば、堅牢なソフトウェアはありません。
Yongwei Wu

2
私が言ったように、インターフェイスが不足しているため、インターフェイスをpytz追跡できません。そのインターフェースの作成者は、パラメーターが長年にわたって変化するタイムゾーンの問題を予期していませんでした。標準のPythonディストリビューションに含まれているからといって、それが完璧なわけではありません。datetimedatetime
Mark Ransom、2018

-8

私の意見では、これはpytzライブラリの設計上の欠陥です。オフセットを使用してタイムゾーンを指定する方が信頼性が高いはずです。

pytz.construct("UTC-07:00")

カナダ/太平洋のタイムゾーンが表示されます。


12
オフセットは年間を通じて変化するため(通常は夏時間のため)、これは通常タイムゾーンと考えられているものとは異なります。
Ryan Hiebert 2016

選択された構文は、tzdataの定義に基づいています。
Brad Koch
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.