1

私はジャンゴを使用しています。

設定で:

TIME_ZONE = 'Europe/Copenhagen'
USE_TZ = True

DST のため、2013 年 3 月 31 日に時計が 1 時間スキップします。01:59 から 03:00 へ

私は見ます:

日付と時刻は現地時間で表示されます。これらをutcとして挿入したい。

以下のコードは UTC として正しく保存されますが、RuntimeWarning が返されます: DateTimeField はナイーブな日時を受け取りました

the_date = datetime.datetime(2013, 3, 31, 1, 59)
hit = hits(date= the_date); hit.save(); # Correctly saved as 00:59:00

the_date = datetime.datetime(2013, 3, 31, 3, 1)
hit = hits(date= the_date); hit.save(); # Correctly saved as 01:01:00

日時を認識させることで警告を回避できると思いました。警告は回避されますが、変換が間違っています。

tz = timezone(settings.TIME_ZONE)
the_date = datetime.datetime(2013, 3, 31, 3, 1, tzinfo = tz)
hit = hits(date= the_date); hit.save(); # Incorrectly saved as 02:01:00

以下は、実行時エラーなしで機能します。

I have installed pytz.
the_date = local_tz.localize(datetime.datetime(2013, 3, 31, 3, 1))

私の質問にたどり着く:

夏時間が考慮されていないため、tzinfo が機能しないことがわかりました。よし、使わない。しかし、次のことがうまくいくように見えたとき、私は混乱しました:

the_date = datetime.datetime.now(local_tz)

これは、冬時間 (utc を取得するために 1 時間を減算した場合) と、コンピューターの systime を夏の日付に変更した場合 (utc を取得するために 2 時間を減算した場合) の両方で、utc として正しく挿入されました。

私の質問:

.now(local_tz) は機能しますか、それとも間違ってテストしましたか? これが tzinfo = tz と異なるのはなぜですか? それとも、tzinfo を間違って使用していますか?

4

1 に答える 1

0

できるだけ早く UTC に変換し、内部でのみ UTC を使用することをお勧めします。タイムゾーンを越えて移動する場合 (船舶など) を除いて、タイムゾーン情報を保存する必要がある場合を除きます。一定のタイムゾーンの場合は、入力/出力にローカル時間を使用し、ユーザー インターフェイスで UTC に変換する方がはるかに簡単です。 .

現地時間から UTC に変換するには、pytz.timezone.normalize夏時間やその他のタイムゾーンの移行を処理するメソッドを使用する必要があります。ドキュメントのこのセクションをpytz参照してください。あなたの場合、ローカル日時を UTC に変換するには、次のものが必要です。

from pytz import timezone, utc

local_tz = timezone(settings.TIME_ZONE)
local_dt = datetime.datetime(2013, 3, 31, 3, 1, tzinfo = local_tz)
utc_dt = utc.normalize(local_dt.astimezone(utc))
于 2012-11-13T13:21:24.007 に答える