2

MongoEngine を使用して日付オブジェクトを Mongo に保存するのに問題があります。これが私のコードです:

print isodate
>>> 2014-07-01T20:00:00.000Z

import pytz
from dateutil import parser

tz = pytz.timezone('Europe/London')
start = parser.parse(isodate).replace(tzinfo=None)
start = tz.localize(start)

print start
>>> 2014-07-01 20:00:00+01:00

日付のローカライズはうまくいくようですが、Mongo に保存する場合:

f = Fixture(
    start=start
)

作成された Mongo ドキュメントを見ると、次のような奇妙なことが起こっています。

{
  _id: ObjectId("53b1dfbde20b47102c824a8f"),
  start: ISODate("2014-07-01T19:00:00Z")
}

時間が 2 時間ずれていて、タイムゾーンが存在しない理由はありますか?

4

1 に答える 1

2

日付と時刻の形式を誤解しているようです。W3C の日付と時刻の形式を参照してください。

  1. 時刻は UTC (協定世界時) で表され、特別な UTC 指定子 (「Z」) が付けられます。
  2. 時間は現地時間で表され、タイム ゾーン オフセットが時間と分で示されます。"+hh:mm" のタイム ゾーン オフセットは、日付/時刻が UTC より "hh" 時間 "mm" 分進んだローカル タイム ゾーンを使用することを示します。"-hh:mm" のタイム ゾーン オフセットは、日付/時刻が UTC から "hh" 時間、"mm" 分遅れたローカル タイム ゾーンを使用することを示します。

"2014-07-01T20:00:00.000Z" は "2014-07-01 21 :00:00+01:00" と等しくなければなりません。そのため、Mongo への保存ではなく、datetime のローカライズで問題が発生しました。

「....T....Z」を現地時間に変換したい場合は、これを試すことができます:

print isodate
>>> 2014-07-01T20:00:00.000Z
import pytz
from dateutil import parser
local_tz = pytz.timezone('Europe/London')
local_time = parser.parse(isodate).astimezone(local_tz)
print local_time
>>> 2014-07-01 21:00:00+01:00

現地時間で日付計算を実行する必要がある場合は、もう 1 つの手順を実行します (参照: pytz doc )。

local_tz.normalize(local_time)

実際には、"....T....Z" ISODate を現地時間に変換せずに Mongo に直接保存できます。すでにタイムゾーン情報が含まれているため、変換は不要です。

于 2014-07-01T04:07:30.567 に答える