51

次のコードを参照してください。

import datetime
import pytz

fmt = '%Y-%m-%d %H:%M:%S %Z'

d = datetime.datetime.now(pytz.timezone("America/New_York"))
d_string = d.strftime(fmt)
d2 = datetime.datetime.strptime(d_string, fmt)
print d_string 
print d2.strftime(fmt)

出力は

2013-02-07 17:42:31 EST
2013-02-07 17:42:31 

タイムゾーン情報は、翻訳で単に失われました。

「%Z」を「%z」に切り替えると、

ValueError: 'z' is a bad directive in format '%Y-%m-%d %H:%M:%S %z'

を使用できることはわかっpython-dateutilていますが、datetime でこの単純な機能を実現できず、さらに依存関係を導入する必要があるのは奇妙だと思いましたか?

4

4 に答える 4

33

ここでの問題の一部は、タイムゾーンを表すために通常使用される文字列が実際には一意ではないことです。「EST」は、北米の人々にとって「America/New_York」を意味するだけです。これは C time API の制限であり、Python の解決策は… いつでも将来のバージョンに完全な tz 機能を追加することです。誰かが PEP を書く気があれば。

タイムゾーンをオフセットとしてフォーマットして解析することはできますが、夏時間/夏時間の情報が失われます (たとえば、夏の「America/Phoenix」と「America/Los_Angeles」を区別できません)。タイムゾーンを 3 文字の略語としてフォーマットできますが、そこから解析することはできません。

あいまいであいまいなものが必要ですが、通常は必要なものが必要な場合は、 のようなサードパーティのライブラリが必要ですdateutil

実際に明確なものが必要な場合は、実際の tz 名を自分でローカルの日時文字列に追加し、反対側で分割して戻します。

d = datetime.datetime.now(pytz.timezone("America/New_York"))
dtz_string = d.strftime(fmt) + ' ' + "America/New_York"

d_string, tz_string = dtz_string.rsplit(' ', 1)
d2 = datetime.datetime.strptime(d_string, fmt)
tz2 = pytz.timezone(tz_string)

print dtz_string 
print d2.strftime(fmt) + ' ' + tz_string

または…これら2つの中間で、pytz「EST」のような形式を(いくつかの任意だが明確に定義された明確な規則に従って)解析できるライブラリをすでに使用しています。したがって、本当に必要な場合は%Z、書式設定側に in を残してから、それを取り出して で解析してpytz.timezone()から、残りを に渡すことができstrptimeます。

于 2013-02-07T23:55:03.130 に答える
11

残念ながら、strptime()OS によって構成されたタイムゾーンしか処理できず、実際にはタイム オフセットとしてしか処理できません。ドキュメントから:

ディレクティブのサポートは、 およびが trueであるかどうか%Zに含まれる値に基づいています。このため、常に知られている UTC と GMT を認識することを除いて、プラットフォーム固有です (そして、夏時間以外のタイムゾーンと見なされます)。tznamedaylight

strftime()公式にはサポートしていません%z

python-dateutil残念ながら、タイムゾーンの解析をサポートするために立ち往生しています。

于 2013-02-07T23:43:34.977 に答える