【问题标题】:Make Datetime Timezone Aware From UTC Offset and DST Bit从 UTC 偏移量和 DST 位了解日期时间时区
【发布时间】:2015-02-14 08:45:09
【问题描述】:

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

【问题讨论】:

  • 有多个区域映射到一个偏移量,因此您需要将偏移量应用于您自己创建的区域映射。

标签: python django datetime


【解决方案1】:

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

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

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

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

  2. 从偏移量 / 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)

【讨论】:

    猜你喜欢
    • 2014-02-04
    • 1970-01-01
    • 2011-08-04
    • 2011-04-11
    • 2016-08-29
    • 2011-12-13
    • 2012-08-02
    • 2018-03-01
    相关资源
    最近更新 更多