3.16 结合时区的日期操作

    对几乎所有涉及到时区的问题,你都应该使用 模块。这个包提供了Olson时区数据库,它是时区信息的事实上的标准,在很多语言和操作系统里面都可以找到。

    pytz 模块一个主要用途是将 库创建的简单日期对象本地化。比如,下面如何表示一个芝加哥时间的示例:

    一旦日期被本地化了, 它就可以转换为其他时区的时间了。为了得到班加罗尔对应的时间,你可以这样做:

    1. >>> # Convert to Bangalore time
    2. >>> bang_d = loc_d.astimezone(timezone('Asia/Kolkata'))
    3. 2012-12-21 21:00:00+05:30
    4. >>>

    结果错误是因为它并没有考虑在本地时间中有一小时的跳跃。为了修正这个错误,可以使用时区对象 normalize() 方法。比如:

    1. >>> from datetime import timedelta
    2. >>> later = central.normalize(loc_d + timedelta(minutes=30))
    3. >>> print(later)
    4. >>>

    为了不让你被这些东东弄的晕头转向,处理本地化日期的通常的策略先将所有日期转换为UTC时间,并用它来执行所有的中间存储和操作。比如:

    一旦转换为UTC,你就不用去担心跟夏令时相关的问题了。因此,你可以跟之前一样放心的执行常见的日期计算。当你想将输出变为本地时间的时候,使用合适的时区去转换下就行了。比如:

    1. >>> later_utc = utc_d + timedelta(minutes=30)
    2. >>> print(later_utc.astimezone(central))
    3. 2013-03-10 03:15:00-05:00
    4. >>>

    注:当你阅读到这里的时候,有可能 pytz 模块已经不再建议使用了,因为PEP431提出了更先进的时区支持。但是这里谈到的很多问题还是有参考价值的(比如使用UTC日期的建议等)。

    原文: