オフセット付きの完全な日付を受け取る 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 つの文字列に分割し、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で次のエラーが発生します: .+0200
datetime.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()