/ /日付とタイムゾーンを含む文字列をUTCのdatetimeに解析 - python、datetime、python-3.x、datetime-format、datetimeoffset

日付と時刻をUTC datetimeに変換する文字列を解析する - python、datetime、python-3.x、datetime-format、datetimeoffset

私はPython 3のスクリプトを書いています。オフセット付きの日付とオフセットなしの別の日付を比較できるようにしたい。私が直面している主な問題は、Pythonが別のオフセットdatetimeオブジェクトを好まないように思われることです。

>>> date_string
"Wed, 8 May 2013 15:33:29 +0200"
>>> new_date = datetime.strptime(date_string, "%a, %d %b %Y %H:%M:%S %z")
>>> new_date
datetime.datetime(2013, 5, 8, 15, 33, 29, tzinfo=datetime.timezone(datetime.timedelta(0, 7200)))
>>> new_date - datetime.today()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can"t subtract offset-naive and offset-aware datetimes

回避策として、「削除しました」 date_string 1つは日付ともう1つはオフセットとの2つの文字列になります。

>>> date_string
"Wed, 8 May 2013 15:33:29 +0200"
>>> match = re.match(r"(.*)(s+d{4})",date_string)
>>> match.group(1)
"Wed, 8 May 2013 15:33:29"
>>> match.group(2)
" +0200"
>>> parsed_date = datetime.strptime(match.group(1), "%a, %d %b %Y %H:%M:%S")
>>> match_delta = re.match(r"s+(d{2})(d{2})",match.group(2))
>>> parsed_date_delta = timedelta(minutes=int(match_delta.group(2)),hours=int(match_delta.group(1)))
>>> parsed_date_complete = parsed_date + parsed_date_delta
>>> parsed_date_complete
datetime.datetime(2013, 5, 8, 17, 33, 29)

これにより、正しいオフセットが適用された状態で最後の1時間を取得することができるので、他の通常のdatetimeオブジェクトと比較してもエラーにはなりません。

私が疑問に思うのは、これを達成するためのもっと簡単な、あるいはもっと効率的な方法があるかどうかということです。アイデアは、このような文字列を受け取ることです。 Wed, 8 May 2013 15:33:29 +0200 オフセットなしでdatetimeオブジェクトに変換できるので、UTC時間で作業できます。

編集:もう少し問題を説明するために、 new_date のオフセット値 +0200 while datetime.today() そして datetime.utcnow() そのオフセットを持っていないので、それを比較しようとしたり、何らかの操作をしたりしようとすると、Pythonでは次のエラーが発生します。 TypeError: can"t subtract offset-naive and offset-aware datetimes.

日付が Wed, 8 May 2013 15:33:29 +0200私が欲しいのは、このような日付を計算する方法です。 Wed, 8 May 2013 17:33:29オフセット値はありませんが、正しい時間があります(オフセットは時間に適用されます)。そのように、私はオフセットを持っていないので、私は自由に何かをすることができます datetime.today() そして datetime.utcnow()

回答:

回答№1は1

私はpythonの達人ではありませんが、によると これらのドキュメント

クラス方法 datetime.today()

現在のローカル日時を返します。 tzinfo 無し。 ...

返品に関連付けられたタイムゾーンはありません値。 UTCではなく、オフセットは不特定です。したがって、この2つを比較することはできません。結果は無意味です。

言い換えれば、あなたはこれの結果はどうなると思いますか?

10 May 2013 13:00 +0200  >  10 May 2013 12:00
  • それ できた 本当だから 13:00 大きいです より 12:00.
  • それ できた ローカルタイムゾーンのオフセットが -0100だから、あなたは瞬間を比較しています 11:00Z > 13:00Z。しかし、指定しなかったので、ローカルオフセットを使用するつもりなのかどうかは誰にもわかりません。

左側で正確な瞬間を参照していますが、右側であいまいな瞬間を参照しているので、操作はエラーを与えます。

あなたがこれをやろうとするときにPythonがエラーを出すのは良いことです。Netのような他のフレームワークはいくつかの仮定をして、あなたが期待していたものではないかもしれない結果を返します。ここをクリック 興味があれば。)

だからあなたの質問に戻って、あなたは言った:

アイデアは、次のような文字列を受け取ることです。2013年5月8日15時33分29秒+0200、オフセットなしでdatetimeオブジェクトに変換できるので、UTC時間を処理できます。

あなたが持っている文字列はすでにUTCからのオフセットを反映しています。あなたがそれをパースしている方法はそれでいいのです。あなたはただそれをもっと意味のある何かと比較する必要があります。 datetime.now(timezone.utc)