我正在编写一个 Python 3 脚本,该脚本接收一个带有偏移的完整日期,我希望能够将它与另一个没有偏移的日期进行比较。我面临的主要问题是Python似乎不喜欢不同的偏移日期时间对象,因为当您尝试对这些对象进行任何操作时它会抱怨:
>>> 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
其拆分为两个字符串,一个带有日期,一个带有偏移量,创建两个对象:一个日期和一个增量,它们将它们相加:
>>> 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)
有了这个,我可以得到一个应用了正确偏移量的最后一个小时,所以与另一个正常的 datetime 对象的任何比较都不会引发错误。
我想知道是否有更简单或更有效的方法来实现这一目标。这个想法是接收一个像这样的字符串:Wed, 8 May 2013 15:33:29 +0200
并且能够在没有偏移的日期时间对象中转换它,所以我可以使用 UTC 时间。
编辑:为了解释更多问题,new_date
偏移值为+0200
whiledatetime.today()
并且datetime.utcnow()
没有该偏移量,因此尝试比较它或执行任何操作会在 Python 中出现以下错误:TypeError: can't subtract offset-naive and offset-aware datetimes
.
如果 date 是Wed, 8 May 2013 15:33:29 +0200
,我想要的是一种计算日期的方法,如下所示:Wed, 8 May 2013 17:33:29
,没有偏移值但具有正确的时间(偏移应用于时间)。这样,由于我没有偏移量,我可以自由地使用datetime.today()
anddatetime.utcnow()