结合时区的日期操作

问题

你有一个安排在 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
>>>

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

>>> # Convert to Bangalore time
>>> bang_d = loc_d.astimezone(timezone('Asia/Kolkata'))
>>> print(bang_d)
2012-12-21 21:00:00+05:30 # Kolkata 的时区时区 UTC +05:30
>>>

如果你打算在本地化日期上执行计算,你需要特别注意夏令时转换和其他细节。比如,在 2013 年,美国标准夏令时时间开始于本地时间 3 月 13 日凌晨 2:00(在那时,时间向前跳过一小时)。如果你正在执行本地计算,你会得到一个错误。比如:

>>> d = datetime(2013, 3, 10, 1, 45)
>>> loc_d = central.localize(d)
>>> print(loc_d)
2013-03-10 01:45:00-06:00
>>> later = loc_d + timedelta(minutes=30)
>>> print(later)
2013-03-10 02:15:00-06:00 # WRONG! WRONG!
>>>

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

>>> from datetime import timedelta
>>> later = central.normalize(loc_d + timedelta(minutes=30))
>>> print(later)
2013-03-10 03:15:00-05:00
>>>

讨论

为了不让你被这些东东弄的晕头转向,处理本地化日期的通常的策略先将所有日期转换为 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文档

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

《Python Cookbook 3rd》笔记(3.16):结合时区的日期操作相关推荐

  1. 《Python Cookbook 3rd》笔记(1.4):查找最大或最小的N个元素

    <Python Cookbook 3rd>1.4:查找最大或最小的N个元素 问题 怎样从一个集合中获得最大或者最小的N个元素列表? 解法 heapq 模块有两个函数:nlargest()和 ...

  2. 《Python Cookbook 3rd》笔记汇总

    文章目录 一.数据结构 二.字符串和文本 三.数字.日期和时间 四.迭代器与生成器 五.文件与IO 一.数据结构 标题 关键词 1.1:拆分序列后赋值给多个变量 可迭代对象.拆分赋值 1.2:拆分任意 ...

  3. Python Cookbook 3rd Edition Documentation

    Python Cookbook 3rd Edition Documentation 文章目录 第一章:数据结构和算法 1.1 解压序列赋值给多个变量 问题 解决方案 讨论 1.2 解压可迭代对象赋值给 ...

  4. 《Python cookbook》笔记二

    <Python cookbook>笔记二 第二章 字符串和文本 -使用多个界定符分割字符串- 你需要将一个字符串分割为多个字段,但是分隔符 (还有周围的空格) 并不是固定 的. # str ...

  5. Machine Learning with Python Cookbook 学习笔记 第8章

    Chapter 8. Handling Images 前言 本笔记是针对人工智能典型算法的课程中Machine Learning with Python Cookbook的学习笔记 学习的实战代码都放 ...

  6. Machine Learning with Python Cookbook 学习笔记 第9章

    Chapter 9. Dimensionality Reduction Using Feature Extraction 前言 本笔记是针对人工智能典型算法的课程中Machine Learning w ...

  7. Machine Learning with Python Cookbook 学习笔记 第6章

    Chapter 6. Handling Text 本笔记是针对人工智能典型算法的课程中Machine Learning with Python Cookbook的学习笔记 学习的实战代码都放在代码压缩 ...

  8. Python数模笔记-NetworkX(1)图的操作

    1.NetworkX 图论与网络工具包 NetworkX 是基于 Python 语言的图论与复杂网络工具包,用于创建.操作和研究复杂网络的结构.动力学和功能. NetworkX 可以以标准和非标准的数 ...

  9. Python之字符串转换为日期、结合时区的日期操作

    一.字符串转换为日期 方法一 s = '2019-01-20' print(datetime.strptime(s, '%Y-%m-%d')) # 2019-01-20 00:00:00 方法二 de ...

最新文章

  1. Android app 别用中文名
  2. win10 docker desktop无法拉取镜像解决办法
  3. JSP——JavaBean应用
  4. 关于Python的编译
  5. android 多参数,玩转Android monkey之多参数实战
  6. JMeter定制功能实现
  7. mysql 5.5数据库主从配置步骤详解
  8. HDU1572 下沙小面的(2)【全排列】
  9. mac 上搭建SVN
  10. Ural 1043 Cover the Arc
  11. 饿了吗!来点营养的-华为USG6000V防火墙超详细配置
  12. vue实现中英文切换
  13. git 远程仓库和本地仓库建立连接
  14. Delphi 10.3.1 TNetHttpClient在多线程中存在的问题及解决方法。
  15. 基于Python实现的实时聊天系统
  16. 摸爬滚打DirectX11_day08——纹理映射
  17. 原创小说 - 范特西学院(上)
  18. how2j网站前端项目——天猫前端(第一次)学习笔记4
  19. 解决eclipse启动Tomcat报错,显示8005和8080端口被占用的问题
  20. SQLServer日期函数的使用

热门文章

  1. 专业程序员必知必会的技巧:驯服复杂代码
  2. python如何进行格式化输出变量_Python变量格式化输出实现原理解析
  3. python ios 坐标点击_python点击鼠标获取坐标(Graphics)
  4. 计算机组装与维护模拟测试题三答案,春季高考信息技术模拟题3(计算机组装与维修部分含答案)...
  5. java 日志设计_Java日志设计实践(3) - 开发篇
  6. vb 通过php连接mysql数据库连接_PHP连接MySQL数据库的几种方法
  7. 【转】走进windows编程的世界-----对话框、文本框、按钮
  8. SharePoint入门识记-整体架构
  9. C#多线程编程系列(五)- 使用任务并行库
  10. [你必须知道的.NET]第三十一回,深入.NET 4.0之,从“新”展望