2

オフセット付きの完全な日付を受け取る 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_string1 つは日付、もう 1 つはオフセットを含む 2 つの文字列に分割し、2 つのオブジェクト (1 つは日付、もう 1 つはデルタ) を作成し、それらを合計します。

>>> 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)

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

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

編集:問題をもう少し説明するには、 whilenew_dateのオフセット値があり、そのオフセットがないため、比較または操作を実行しようとすると、Pythonで次のエラーが発生します: .+0200datetime.today()datetime.utcnow()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()

4

1 に答える 1

1

私はPythonの第一人者ではありませんが、これらのドキュメントによると:

クラスメソッド datetime.today()

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

戻り値に関連付けられたタイム ゾーンはありません。UTC ではありません。オフセットは指定されていません。したがって、この 2 つを比較できないのは理にかなっています。結果は無意味でしょう。

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

10 May 2013 13:00 +0200  >  10 May 2013 12:00
  • は より大きいであるため、真である可能があります。13:0012:00
  • ローカル タイム ゾーンのオフセットがであるため、誤っている可能性があります。しかし、指定しなかったので、ローカル オフセットを使用するつもりだったかどうかは誰にもわかりません。-010011:00Z > 13:00Z

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

これを行おうとすると Python がエラーを出すのは良いことです。.Net などの他のフレームワークは、いくつかの仮定を行い、期待していたものとは異なる結果を返す場合があります。(興味のある方はこちらをお読みください。)

質問に戻ると、あなたは次のように言いました。

Wed, 8 May 2013 15:33:29 +0200 のような文字列を受け取り、それをオフセットなしで日時オブジェクトに変換できるようにすることで、UTC 時間で作業できるようにします。

あなたが持っている文字列はすでにUTCからのオフセットを反映しています。あなたがそれを解析している方法は問題ありません。次のような、より意味のあるものと比較する必要があるだけです。datetime.now(timezone.utc)

于 2013-05-10T15:34:03.140 に答える