我正在编写一个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
的偏移值为+0200
而datetime.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()
答案 0 :(得分:1)
我不是蟒蛇大师,但根据these docs:
classmethod
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)做出一些假设并返回可能与您预期不同的结果。 (Read here如果你有兴趣的话。)
回到你的问题,你说:
我的想法是收到一个像这样的字符串:Wed,2013年5月8日15:33:29 +0200并且能够在没有偏移的日期时间对象中转换它,所以我可以使用UTC时间。
您拥有的字符串已经反映了它与UTC的偏移量。解析它的方式很好。您只需将其与更有意义的内容进行比较,例如datetime.now(timezone.utc)