私は Python や Django の第一人者ではないので、誰かが私よりもうまく答えられるかもしれません。しかし、私はとにかくそれを推測します。
あなたはそれをDjangoに保存していると言いました.Djangoはあなたが参照したドキュメントDateTimeField
によると、それをPythonとして保存しています.datetime
のドキュメントをdatetime
見ると、重要なのは「素朴な」値と「認識している」値の違いを理解することだと思います。
そして、さらに調査したところ、この優れた参考文献に出会いました。2 番目のセクション「単純で認識可能な datetime オブジェクト」を必ずお読みください。これにより、Django がこれをどの程度制御しているかが少しわかります。基本的に、 を設定するUSE_TZ = true
ことで、Django にナイーブな日時ではなく、認識可能な日時を使用するように求めます。
それで、私はあなたの質問を振り返りました。あなたは次のことをしていると言いました:
dt = datetime.fromtimestamp(secs)
dt = dt.replace(tzinfo=utc)
fromtimestamp関数のドキュメントを見ると、次のテキストが見つかりました。
オプションの引数tz
が指定されているNone
か指定されていない場合、timestamp
はプラットフォームのローカルの日付と時刻に変換され、返さdatetime
れるオブジェクトはナイーブです。
だから私はあなたがこれを行うことができると思います:
dt = datetime.fromtimestamp(secs, tz=utc)
次に、その関数のすぐ下に、ドキュメントがutcfromtimestamp
関数を表示するので、次のようにする必要があります。
dt = datetime.utcfromtimestamp(secs)
これらが同等かどうかを知るにはPythonについて十分に知りませんが、どちらかが違いを生むかどうかを試してみることができます.
うまくいけば、これらの1つが違いを生むでしょう。そうでない場合は、お知らせください。私は JavaScript と .Net の日付/時刻に精通していますが、これらのニュアンスが Python などの他のプラットフォームでどのように異なるのか常に興味があります。
アップデート
質問の MySQL 部分については、この fiddleをご覧ください。
CREATE TABLE foo (`date` DATETIME);
INSERT INTO foo (`date`) VALUES (FROM_UNIXTIME(1371131402));
SET TIME_ZONE="+00:00";
select `date`, UNIX_TIMESTAMP(`date`) from foo;
SET TIME_ZONE="+01:00";
select `date`, UNIX_TIMESTAMP(`date`) from foo;
結果:
DATE UNIX_TIMESTAMP(`DATE`)
June, 13 2013 13:50:02+0000 1371131402
June, 13 2013 13:50:02+0000 1371127802
関数の動作UNIX_TIMESTAMP
は実際に MySQL のTIME_ZONE
設定の影響を受けるようです。ドキュメントに記載されているので、それほど驚くことではありません。驚くべきことはdatetime
、設定に関係なく、 の文字列出力が同じ UTC 値を持つことです。
これが私が起こっていると思うことです。UNIX_TIMESTAMP
関数のドキュメントでは、次のように述べています。
date
は、DATE
文字列、DATETIME
文字列、a 、またはorTIMESTAMP
の形式の数値です。YYMMDD
YYYYMMDD
それが a である可能性があるとは言っていないことに注意してくださいDATETIME
- それはDATETIME
stringである可能性があると言っています。したがって、実際の値は、関数に渡される前に暗黙的に文字列に変換されると思います。
それでは、明示的に変換するこの更新されたフィドルを見てください。
SET TIME_ZONE="+00:00";
select `date`, convert(`date`, char), UNIX_TIMESTAMP(convert(`date`, char)) from foo;
SET TIME_ZONE="+01:00";
select `date`, convert(`date`, char), UNIX_TIMESTAMP(convert(`date`, char)) from foo;
結果:
DATE CONVERT(`DATE`, CHAR) UNIX_TIMESTAMP(CONVERT(`DATE`, CHAR))
June, 13 2013 13:50:02+0000 2013-06-13 13:50:02 1371131402
June, 13 2013 13:50:02+0000 2013-06-13 13:50:02 1371127802
文字データに変換すると、オフセットが取り除かれていることがわかります。UNIX_TIMESTAMP
もちろん、この値を入力として受け取ると、ローカル タイム ゾーンの設定が想定されるため、別の UTC タイムスタンプが取得されることは理にかなっています。
これが役立つかどうかはわかりません。Django が読み取りと書き込みの両方で MySQL を呼び出す方法を正確に掘り下げる必要があります。実際にUNIX_TIMESTAMP
機能を使用していますか?それとも、それはあなたがテストで行ったことですか?