时间戳记的时区偏移部分必须介于-12到+14小时之间。否则,这是荒谬的。我正在处理pandas数据框广告中的时间戳字符串字段,由于偏移超出了-12 + 14小时的界限,因此我的某些时间戳是没有意义的。
一个好的时间戳:
good = '2019-11-11T07:08:09.640-4:00'
错误的时区偏移
bad = '2019-11-19T22:51:34.619000+17:00'
另一个错误的时区偏移量:
bad2 = '2019-11-11T07:08:09.640-31:00'
现在,如果我尝试将这些字符串转换为isoformat:
按预期工作:
import dateutil
dateutil.parser.parse(good).isoformat()
'2019-11-11T07:08:09.640000-04:00'
无法正常工作,返回时间戳:
dateutil.parser.parse(bad).isoformat()
'2019-11-19T22:51:34.619000+17:00'
按预期方式工作,我收到一条错误消息(随后可以在if else中尝试使用catch块)
dateutil.parser.parse(bad2).isoformat()
Traceback (most recent call last):
File "<input>", line 1, in <module>
ValueError: offset must be a timedelta strictly between -timedelta(hours=24) and timedelta(hours=24).
为什么当它们都超出了时区偏移量时,我会在bad2和不坏消息上得到一条错误消息
答案 0 :(得分:2)
这只是Python中时区偏移量的边界-如错误消息中所述,偏移量最大为±24h,这与您的发现一致。它与实时区域中的当前最大和最小偏移量无关,除了以下事实:如果边界 not 不允许表示所有实时区域,那将是一个问题。
没有任何简单的方法可以使datetime或dateutil失败,因为边界是不可配置的。如果要检测+ 14 / -12以外的偏移量或任何任意限制,则需要检查utcoffset
,如下所示:
if not (timedelta(hours=-12) < dt.utcoffset() < timedelta(hours=14)):
raise ValueError(...)
也就是说,除非您知道某些字符串具有这种特定的错误模式,否则我不建议您采取这种行动。您将学到的处理日期时间和时区的一件事是,对它们进行任意限制很少是一个好主意,因为某个地方的某个随机国家会决定制定一条违反您整洁的“实际”限制的规则。我什至对tzinfo中的±24h偏移量限制保持警惕,但这是语言内置的功能,至少不可能在不久的将来出现真正的偏移量。