15

日時をUTCとして保存するデータベースがあります。特定の時刻の情報を検索する必要がありますが、日付と時刻は現地時間で指定されています。たとえば、「ヨーロッパ/コペンハーゲン」としましょう。私はこれらを次のように与えられます:

year = 2012; month = 12; day = 2; hour = 13; min = 1;

したがって、データベースで検索できるように、これらをUTCに変換する必要があります。を使用してこれを実行したいと思いますpytz。私が見ているlocalize

 local_tz = timezone('Europe/Copenhagen')
 t = local_tz.localize(datetime.datetime(year, month, day, hour, min))

しかし、私はについて混乱していlocalize()ます。これは、その年などが現地時間で私に与えられると仮定していますか?または、それらがUTCで与えられ、現在は現地時間に変換されていると想定していますか?

print t私に与える:

2012-12-02 13:01:00+01:00

したがって、元の年などはUTCであると想定されていたようです。時間は13ではなく13+1になりました。では、代わりに何をすればよいでしょうか。私はpytzのドキュメントを読みましたが、これは私にはわかりません。物事がトリッキーだとたくさん言及されているので、pytzが実際にこれらの問題を解決しているかどうかはわかりません。そして、例が私にうまくいくことを示しているのか、うまくいかないことを示しているのか、私はいつもわかりません。

正規化してみました:

print local_tz.normalize(t)

これで、printtと同じ結果が得られます。

編集:上記の年などの数値を使用すると、2012-12-212:01のデータベース内の情報と一致するはずです。(コペンハーゲンはその日にutc + 1であるため)

4

2 に答える 2

26

localize()タイムゾーンをローカルタイムゾーンのナイーブdatetime.datetimeインスタンスにアタッチします。

ローカルタイムゾーンに日時の値がある場合は、そのタイムゾーンにローカライズしてから、を使用.astimezone()して値をUTCにキャストします。

>>> localdt = local_tz.localize(datetime.datetime(year, month, day, hour, min))
>>> localdt.astimezone(pytz.UTC)
datetime.datetime(2012, 12, 2, 12, 1, tzinfo=<UTC>)

これを行う必要はないことに注意してください。タイムゾーンdatetimeを持つオブジェクトを比較できます。テストでは、両方ともUTCに正規化されます。

>>> localdt.astimezone(pytz.UTC) == localdt
True
于 2012-11-12T15:03:38.480 に答える
0

着信時間表現がEurope/Copenhagenタイムゾーン内にあることがわかっている場合は、最初にタイムゾーン対応として作成できます。

local_tz = timezone('Europe/Copenhagen')
t = local_tz.localize(datetime.datetime(year, month, day, hour, min))

次に、これを次のように「変換」できますUTC

t_utc = t.astimezone(pytz.UTC)

ただし、データベースドライバの状態によっては、これは必要ない場合があります。tt_utc同じ時点を表し、正常に動作するコードはそれらを交換可能に扱う必要があります。(year, month, day, hour, minute, second, …)タプルは、特定のタイムゾーンおよびカレンダーシステムにおけるこの時点の人間が読める形式にすぎません。

于 2012-11-12T15:09:47.047 に答える