《Python Cookbook 3rd》笔记(3.16):结合时区的日期操作
结合时区的日期操作
问题
你有一个安排在 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):结合时区的日期操作相关推荐
- 《Python Cookbook 3rd》笔记(1.4):查找最大或最小的N个元素
<Python Cookbook 3rd>1.4:查找最大或最小的N个元素 问题 怎样从一个集合中获得最大或者最小的N个元素列表? 解法 heapq 模块有两个函数:nlargest()和 ...
- 《Python Cookbook 3rd》笔记汇总
文章目录 一.数据结构 二.字符串和文本 三.数字.日期和时间 四.迭代器与生成器 五.文件与IO 一.数据结构 标题 关键词 1.1:拆分序列后赋值给多个变量 可迭代对象.拆分赋值 1.2:拆分任意 ...
- Python Cookbook 3rd Edition Documentation
Python Cookbook 3rd Edition Documentation 文章目录 第一章:数据结构和算法 1.1 解压序列赋值给多个变量 问题 解决方案 讨论 1.2 解压可迭代对象赋值给 ...
- 《Python cookbook》笔记二
<Python cookbook>笔记二 第二章 字符串和文本 -使用多个界定符分割字符串- 你需要将一个字符串分割为多个字段,但是分隔符 (还有周围的空格) 并不是固定 的. # str ...
- Machine Learning with Python Cookbook 学习笔记 第8章
Chapter 8. Handling Images 前言 本笔记是针对人工智能典型算法的课程中Machine Learning with Python Cookbook的学习笔记 学习的实战代码都放 ...
- Machine Learning with Python Cookbook 学习笔记 第9章
Chapter 9. Dimensionality Reduction Using Feature Extraction 前言 本笔记是针对人工智能典型算法的课程中Machine Learning w ...
- Machine Learning with Python Cookbook 学习笔记 第6章
Chapter 6. Handling Text 本笔记是针对人工智能典型算法的课程中Machine Learning with Python Cookbook的学习笔记 学习的实战代码都放在代码压缩 ...
- Python数模笔记-NetworkX(1)图的操作
1.NetworkX 图论与网络工具包 NetworkX 是基于 Python 语言的图论与复杂网络工具包,用于创建.操作和研究复杂网络的结构.动力学和功能. NetworkX 可以以标准和非标准的数 ...
- Python之字符串转换为日期、结合时区的日期操作
一.字符串转换为日期 方法一 s = '2019-01-20' print(datetime.strptime(s, '%Y-%m-%d')) # 2019-01-20 00:00:00 方法二 de ...
最新文章
- Android app 别用中文名
- win10 docker desktop无法拉取镜像解决办法
- JSP——JavaBean应用
- 关于Python的编译
- android 多参数,玩转Android monkey之多参数实战
- JMeter定制功能实现
- mysql 5.5数据库主从配置步骤详解
- HDU1572 下沙小面的(2)【全排列】
- mac 上搭建SVN
- Ural 1043 Cover the Arc
- 饿了吗!来点营养的-华为USG6000V防火墙超详细配置
- vue实现中英文切换
- git 远程仓库和本地仓库建立连接
- Delphi 10.3.1 TNetHttpClient在多线程中存在的问题及解决方法。
- 基于Python实现的实时聊天系统
- 摸爬滚打DirectX11_day08——纹理映射
- 原创小说 - 范特西学院(上)
- how2j网站前端项目——天猫前端(第一次)学习笔记4
- 解决eclipse启动Tomcat报错,显示8005和8080端口被占用的问题
- SQLServer日期函数的使用
热门文章
- 专业程序员必知必会的技巧:驯服复杂代码
- python如何进行格式化输出变量_Python变量格式化输出实现原理解析
- python ios 坐标点击_python点击鼠标获取坐标(Graphics)
- 计算机组装与维护模拟测试题三答案,春季高考信息技术模拟题3(计算机组装与维修部分含答案)...
- java 日志设计_Java日志设计实践(3) - 开发篇
- vb 通过php连接mysql数据库连接_PHP连接MySQL数据库的几种方法
- 【转】走进windows编程的世界-----对话框、文本框、按钮
- SharePoint入门识记-整体架构
- C#多线程编程系列(五)- 使用任务并行库
- [你必须知道的.NET]第三十一回,深入.NET 4.0之,从“新”展望