• python pytz 结合时区的日期操作


    有一个安排在2012 年12 月21 日早上9:30 的电话会议,地点在芝加哥。而朋友在印度的班加罗尔,那么他应该在当地时间几点参加这个会议呢?

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

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

    >>> from datetime import datetime
    >>> from pytz import timezone
    >>> d = datetime(2012, 12, 21, 9, 30, 0)
    >>> print(d)
    2012-12-21 09:30:00
    >>>
    >>> # Localize the date for Chicago
    >>> central = timezone('US/Central')
    >>> loc_d = central.localize(d)
    >>> print(loc_d)
    2012-12-21 09:30:00-06:00
    

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

    >>> bang_d = loc_d.astimezone(timezone('Asia/Kolkata'))
    >>> print(bang_d)
    2012-12-21 21:00:00+05:30
    

    or

    处理本地化日期的通常的策略先将所有日期转换为UTC 时间,并用它来执行所有的中间存储和操作。

    >>> print(loc_d)
    2013-03-10 01:45:00-06:00
    >>> utc_d = loc_d.astimezone(pytz.utc)
    >>> print(utc_d)
    2013-03-10 07:45:00+00:00
    

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

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

     当涉及到时区操作的时候,有个问题就是我们如何得到时区的名称。比如,在这个例子中,我们如何知道“Asia/Kolkata”就是印度对应的时区名呢?为了查找,可以使用ISO 3166 国家代码作为关键字去查阅字典pytz.country timezones 。比如:

    >>> pytz.country_timezones['IN']
    ['Asia/Kolkata']
    

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

  • 相关阅读:
    轻松掌握Ajax.net系列教程十二:使用TabContainer&TabPanel
    轻松掌握Ajax.net系列教程十五:使用AutoCompleteExtender
    一步一步学Linq to sql(二):DataContext与实体
    一步一步学Linq to sql(十):分层构架的例子
    轻松掌握Ajax.net系列教程十四:使用CalendarExtender
    一步一步学Linq to sql(八):继承与关系
    整理了一些tsql技巧
    一步一步学Linq to sql(三):增删改
    数据库连接字符串大全
    海量数据库的查询优化及分页算法方案
  • 原文地址:https://www.cnblogs.com/baxianhua/p/9947109.html
Copyright © 2020-2023  润新知