Pythonライブラリpytzのtimezone引数に可能なすべての値を知りたいのですが。どうやってするの?
ssl.cert_time_to_second()
ASN1_TIME_print()
Pythonライブラリpytzのtimezone引数に可能なすべての値を知りたいのですが。どうやってするの?
ssl.cert_time_to_second()
ASN1_TIME_print()
回答:
使用可能なすべてのタイムゾーンをリストすることができます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
'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()
(結果は-28800ではありません)。pytzは避けます。dateutil.tzは同様の機能を提供しますが、OSタイムゾーンデータベースを使用し、そのような問題はありません。
独自のリストを作成しないでください - 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
タイムゾーン名は、タイムゾーンを指定する唯一の信頼できる方法です。
ここにタイムゾーン名のリストがあります。http://en.wikipedia.org/wiki/List_of_tz_database_time_zones このリストには、America / New_Yorkと正しく呼ばれるタイムゾーンのUS / Easternなど、多くのエイリアス名が含まれていることに注意してください。
プログラムでzoneinfoデータベースからこのリストを作成する場合は、zoneinfoデータベースのzone.tabファイルからリストをコンパイルできます。私はpytzがそれらを取得するためのAPIを持っているとは思いません。また、それが非常に役立つとは思いません。
ここでは、国コード、名前、大陸、首都、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
それが役に立てば幸い。
編集:あなたがこの回答をさらに投票しない場合は、私はそれを感謝します。この答えは間違っていますが、私はむしろそれを歴史的なメモとして残したいと思います。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インターフェースに惑わされたことを示しています。
pytz
、間違って使用しています。PSこれは、質問への答えではありませんすべてで。
datetime
、間違っているのはインターフェースではありませんpytz
。datetime
はインテリジェントなタイムゾーンオブジェクトを予期していなかったため、そのインターフェースはそれらを適切に初期化しません。
datetime
これは標準のPythonライブラリの一部であり、datetime
インターフェースに従う必要があるのはpytzであり、その逆ではありません。誰かが合意なしでより良いと思う方法でインターフェースを実装できれば、堅牢なソフトウェアはありません。
pytz
追跡できません。そのインターフェースの作成者は、パラメーターが長年にわたって変化するタイムゾーンの問題を予期していませんでした。標準のPythonディストリビューションに含まれているからといって、それが完璧なわけではありません。datetime
datetime
私の意見では、これはpytzライブラリの設計上の欠陥です。オフセットを使用してタイムゾーンを指定する方が信頼性が高いはずです。
pytz.construct("UTC-07:00")
カナダ/太平洋のタイムゾーンが表示されます。