我目前正在与我的django应用程序中的时区本地化的残酷野兽作斗争,并且遇到一些麻烦...我想根据位置让天真的日期时间感知时区。我有一个邮政编码数据库,其UTC时间偏差小时,以及0或1,具体取决于邮政编码是否符合夏令时。我如何使用此数据准确地将时区应用于我的日期时间?理想情况下,日期时间将响应DST的变化,而不是总是简单地遵循UTC偏移。
答案 0 :(得分:1)
使用pytz,按照你的描述转换日期时并不难;唯一的复杂因素是获取与数据库中时区描述相对应的tzinfo
个实例。
问题是实时区比偏移+ DST更复杂。例如,不同地区在历史的不同点采用DST,世界上不同的地区可以在一年中的不同点进行DST切换。
如果您的使用仅适用于美国,并且仅涉及未来(非历史)日期,那么有几个选项可以产生准确的结果(尽管请注意下面的警告):
只需创建自己的具体tzinfo
子类,即使用数据库中的偏移量和DST标志。例如,Python documentation为"提供了美国主要时区当前DST规则的完整实施示例代码。"
从offset / DST映射到相应的pytz tzinfo
对象。由于美国只有少数几种可能的组合,只需确定哪个时区名称对应并使用它。
TZ_MAP = {
...
(-5, 1): pytz.timezone('US/Eastern')
...
}
tz = TZ_MAP[(offset, is_dst)]
获得tzinfo
实例后转换很简单,但请注意,处理DST涉及固有的歧义。例如,当时钟在凌晨2点返回时,凌晨1点到凌晨2点之间的所有时间都会在本地时区发生两次。假设你不知道你实际意味着哪一个,你可以随意选择一个,或者提出异常。
# with no is_dst argument, pytz will guess if there is ambiguity
aware_dt = tz.localize(naive_dst)
# with is_dst=None, pytz will raise an exception if there is ambiguity
aware_dt = tz.localize(naive_dst, is_dst=None)