使日期时间区域从UTC偏移和DST位感知

时间:2014-12-16 05:05:54

标签: python django datetime

我目前正在与我的django应用程序中的时区本地化的残酷野兽作斗争,并且遇到一些麻烦...我想根据位置让天真的日期时间感知时区。我有一个邮政编码数据库,其UTC时间偏差小时,以及0或1,具体取决于邮政编码是否符合夏令时。我如何使用此数据准确地将时区应用于我的日期时间?理想情况下,日期时间将响应DST的变化,而不是总是简单地遵循UTC偏移。

1 个答案:

答案 0 :(得分:1)

使用pytz,按照你的描述转换日期时并不难;唯一的复杂因素是获取与数据库中时区描述相对应的tzinfo个实例。

问题是实时区比偏移+ DST更复杂。例如,不同地区在历史的不同点采用DST,世界上不同的地区可以在一年中的不同点进行DST切换。

如果您的使用仅适用于美国,并且仅涉及未来(非历史)日期,那么有几个选项可以产生准确的结果(尽管请注意下面的警告):

  1. 只需创建自己的具体tzinfo子类,即使用数据库中的偏移量和DST标志。例如,Python documentation为"提供了美国主要时区当前DST规则的完整实施示例代码。"

  2. 从offset / DST映射到相应的pytz tzinfo对象。由于美国只有少数几种可能的组合,只需确定哪个时区名称对应并使用它。

    TZ_MAP = {
        ...
        (-5, 1): pytz.timezone('US/Eastern')
        ...
    }
    
    tz = TZ_MAP[(offset, is_dst)]
    
  3. 获得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)