2

我正在编写一个 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偏移值为+0200whiledatetime.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()

4

1 回答 1

1

我不是 python 大师,但根据这些文档

类方法 datetime.today()

返回当前的本地日期时间,tzinfo无。...

没有与返回值关联的时区。它不是UTC,只是未指定偏移量。因此,它不允许您比较两者是有道理的。结果将毫无意义。

换句话说,您期望这样做的结果是什么?

10 May 2013 13:00 +0200  >  10 May 2013 12:00
  • 可能是真的,因为13:00是一个比更大的12:00
  • 可能是错误的,因为本地时区偏移量可能是-0100,所以您正在比较时刻11: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 回答