将日期和时区的字符串解析为UTC日期时间

时间:2013-05-10 07:34:46

标签: python datetime python-3.x datetime-format datetimeoffset

我正在编写一个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)

有了这个,我可以使用正确的偏移量来获得最后一小时,因此与另一个普通日期时间对象的任何比较都不会引发错误。

我想知道的是,是否有更简单或更有效的方法来实现这一目标。我的想法是接收一个像这样的字符串:Wed, 8 May 2013 15:33:29 +0200并且能够在没有偏移量的datetime对象中转换它,所以我可以使用UTC时间。

编辑:为了解释这个问题,new_date的偏移值为+0200datetime.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 个答案:

答案 0 :(得分:1)

我不是蟒蛇大师,但根据these docs

  

classmethod datetime.today()

     

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

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

换句话说,你期望它的结果是什么?

10 May 2013 13:00 +0200  >  10 May 2013 12:00
  • 可能为真,因为13:0012:00更高。
  • 可能为假,因为当地时区偏移可能是-0100,因此您要比较时刻11:00Z > 13:00Z。但谁知道我们是否甚至打算使用本地偏移量,因为我们没有指定。

由于我们指的是左侧的精确时刻,但右侧是模糊的时刻,因此操作会出错。

当你尝试这样做时,Python会给出错误。其他框架(如.Net)做出一些假设并返回可能与您预期不同的结果。 (Read here如果你有兴趣的话。)

回到你的问题,你说:

  

我的想法是收到一个像这样的字符串:Wed,2013年5月8日15:33:29 +0200并且能够在没有偏移的日期时间对象中转换它,所以我可以使用UTC时间。

您拥有的字符串已经反映了它与UTC的偏移量。解析它的方式很好。您只需将其与更有意义的内容进行比较,例如datetime.now(timezone.utc)