Python:检查解析的datetime是否有正确的时区

Python:检查解析的datetime是否有正确的时区,python,datetime,pytz,python-dateutil,Python,Datetime,Pytz,Python Dateutil,因此,我有一个ISO格式的aware datetime-2020-03-15T18:00:00+04:00 我想对其进行分析并验证tzinfo是否为“亚洲/迪拜”(UTC+04:00)。不幸的是,dateutil&datetime没有为解析对象提供足够好的tzinfo属性,我可以轻松验证 >>从datetime导入datetime >>>从dateutil.parser导入等参线 >>>进口皮茨 >>> >>>dts=“2020-03-15T18:00:00+04:00” >>>dt=日期时间

因此,我有一个ISO格式的aware datetime-
2020-03-15T18:00:00+04:00

我想对其进行分析并验证tzinfo是否为
“亚洲/迪拜”
(UTC+04:00)。不幸的是,
dateutil
&
datetime
没有为解析对象提供足够好的
tzinfo
属性,我可以轻松验证

>>从datetime导入datetime
>>>从dateutil.parser导入等参线
>>>进口皮茨
>>> 
>>>dts=“2020-03-15T18:00:00+04:00”
>>>dt=日期时间。从异类格式(dts)
>>>dt.tzinfo
datetime.timezone(datetime.timedelta(秒=14400))
>>>dt.tzinfo==pytz.时区(“亚洲/迪拜”)
假的
>>> 
>>>dt=等厚线(dts)
>>>dt.tzinfo
tzoffset(无,14400)
>>>dt.tzinfo==pytz.时区(“亚洲/迪拜”)
假的
我找不到如何处理tzoffset对象,以便可以轻松地将其与时区字符串进行比较


欢迎向正确的方向提出任何建议或意见。

我发现了一个我不喜欢的解决方法(比较时区应该没什么大不了的,但是的,这是一个硬领域),基于

>tz=pytz.时区(“亚洲/迪拜”)
>>>datetime.utcoffset(dt)==tz.utcoffset(dt.replace(tzinfo=None))
真的

问题的答案是“解析的日期时间是‘亚洲/迪拜’”,特别是当您的‘亚洲/迪拜’概念是指
pytz。时区(“亚洲/迪拜”)
总是“否”,因为
dateutil
永远不会将该时区附加到您从ISO 8601日期时间解析的东西上

一个原因是,解析的字符串没有足够的信息来确定生成的规则集-认为“亚洲/ TiBisii”和“亚洲/迪拜”都使用<代码> UTC + 4 < /C>,但它们不代表同一时区。 所以问题是:为什么你需要知道这些信息

如果您只是想在“亚洲/迪拜”中使用datetimes,最好的办法是使用
将其转换为datetimes。astimezone

from dateutil import tz
from dateutil.parser import isoparse

_DUBAI = tz.gettz("Asia/Dubai")
def parse_as_dubai(dt_str):
    dt = isoparse(dt_str)
    if dt.tzinfo is None:
        raise ValueError(f"No time zone offset in {dt_str}")
    return dt.astimezone(_DUBAI)
请注意,只要您解析了时区,无论输入字符串是否最初位于“Asia/Dubai”中,这都是准确的。如果未给出时区,则使用
astimezone
将使用解析日期时间的系统的系统本地时间,这不是您想要的

如果出于某种原因,您需要验证原始日期时间是否与“亚洲/迪拜”具有相同的偏移量(不确定为什么需要此项,但我认为这可能表明日期时间的来源存在问题),然后转换为“亚洲/迪拜”,并检查偏移量是否是您的最佳选择。您可以在上面的代码中添加额外的错误检查:

from dateutil import tz
from dateutil.parser import isoparse

_DUBAI = tz.gettz("Asia/Dubai")
def parse_as_dubai(dt_str):
    dt = isoparse(dt_str)
    if dt.tzinfo is None:
        raise ValueError(f"No time zone offset in {dt_str}")
    rv = dt.astimezone(_DUBAI)
    if dt.utcoffset() != rv.utcoffset():
        raise ValueError(f"{dt_str} not generated in Asia/Dubai!")
    return rv
最后,我建议您不要使用
pytz
,而是使用
dateutil.tz
,特别是因为您已经在使用
dateutil
进行解析。你可以阅读更多关于原因的信息