快乐Python快速上手系列4 - UTC与本地时间转换
2017-12-27 15:05
281 查看
前言
这个Topic,需要点背景知识,Coordinated Universal Time (French: Temps universel coordonné), abbreviated to UTC,称世界统一时间,世界标准时间,国际协调时间。
而我们大家应该都知道的格林威治时间Greenwich Mean Time,是指位于英国伦敦郊区的皇家格林尼治天文台的标准时间,因为本初子午线被定义在通过那里的经线,记得小学地理课就是从这里开始学的,以此子午线,左右划分了东西12个时区,我们的北京位于东8区。
那UTC和GMT的区别在哪里?
理论上来说,格林尼治标准时间的正午是指当太阳横穿格林尼治子午线时(也就是在格林尼治上空最高点时)的时间。由于地球在它的椭圆轨道里的运动速度不均匀,这个时刻可能和实际的太阳时相差16分钟。
地球每天的自转是有些不规则的,而且正在缓慢减速。所以,格林尼治时间已经不再被作为标准时间使用。现在的标准时间——协调世界时(UTC)——由原子钟提供。
所以,我们常见的转换是UTC与Local Time的转换。
LocalTime就与世界的时区划分有关了,全世界分为24个时区,以子午线为界,分别加一或者减一。
另外还有夏令时冬令时,叫Daylight Saving Time,也就是比正常的时间快或者慢一小时,具体问题具体分析。
Python提供的基本数据类型。
两个模块:
1. datetime模块
包含的类型:
2. time模块
该模块,主要以 struct_time结构为基础,处理时间问题。
struct_time结构,python2.7版本。
好了,进入代码。
3. UTC转北京Local Time
定义一个可变offset的tzinfo类, offset是本地时间与UTC的0时区的差,可正可负,不考虑DST时间。
UTC时间格式为:UTC_FORMAT = "%Y-%m-%dT%H:%M:%S.%fZ"
比如2017-04-21T05:58:08.515198Z,其中,字母T用来分隔日期和时间,Z表示zero-timezone.
获得本地时间与zero-timezone的时区差。
举例来说,在国内运行,获得的offset就是8.
从UTC字符串获得一个datetime结构,用函数
datetime.strptime(start_time_str, UTC_FORMAT),第一个参数是时间字符串,如”2017-04-21T05:58:08.515198Z“,第二个是该时间的格式字符串,如”%Y-%m-%dT%H:%M:%S.%fZ”
对于一个UTC时间转换来的datetime类型,先设置其tzinfo为0时区,然后重置时区对象为local tzinfo.
至此,完成UTC到Local Time的转换,反之类似。
注意:
date.strftime(),该函数,生成指定格式的字符串,对于在1900年之前的日期不能使用。
Wish you happy with python:)
这个Topic,需要点背景知识,Coordinated Universal Time (French: Temps universel coordonné), abbreviated to UTC,称世界统一时间,世界标准时间,国际协调时间。
而我们大家应该都知道的格林威治时间Greenwich Mean Time,是指位于英国伦敦郊区的皇家格林尼治天文台的标准时间,因为本初子午线被定义在通过那里的经线,记得小学地理课就是从这里开始学的,以此子午线,左右划分了东西12个时区,我们的北京位于东8区。
那UTC和GMT的区别在哪里?
理论上来说,格林尼治标准时间的正午是指当太阳横穿格林尼治子午线时(也就是在格林尼治上空最高点时)的时间。由于地球在它的椭圆轨道里的运动速度不均匀,这个时刻可能和实际的太阳时相差16分钟。
地球每天的自转是有些不规则的,而且正在缓慢减速。所以,格林尼治时间已经不再被作为标准时间使用。现在的标准时间——协调世界时(UTC)——由原子钟提供。
所以,我们常见的转换是UTC与Local Time的转换。
LocalTime就与世界的时区划分有关了,全世界分为24个时区,以子午线为界,分别加一或者减一。
另外还有夏令时冬令时,叫Daylight Saving Time,也就是比正常的时间快或者慢一小时,具体问题具体分析。
Python提供的基本数据类型。
两个模块:
1. datetime模块
包含的类型:
datetime.date | 日期,年月日 |
datetime.datetime | 年月日小时分秒毫秒,外加tzinfo,也就是时区信息,这个是重点, 提供了一系列有用的函数,如now(), utcnow(), fromtimestamp(), utcfromtimestamp(), strptime() |
datetime.timedelta | 用来计算date, time, datetime之间的时间差 |
datetime.tzinfo | timezone相关,用于datetime, time来提供调整过的时间, 这个类, 是一个抽象类,针对每一个时区,需要一个instance与之对应, 具体用法参照下面代码 |
该模块,主要以 struct_time结构为基础,处理时间问题。
struct_time结构,python2.7版本。
好了,进入代码。
3. UTC转北京Local Time
定义一个可变offset的tzinfo类, offset是本地时间与UTC的0时区的差,可正可负,不考虑DST时间。
class LTZ(tzinfo): def __init__(self, hour_delta): self.hour_delta = hour_delta def utcoffset(self, *args, **kwargs): return timedelta(hours = self.hour_delta) def dst(self, *args, **kwargs): return timedelta(0) |
比如2017-04-21T05:58:08.515198Z,其中,字母T用来分隔日期和时间,Z表示zero-timezone.
获得本地时间与zero-timezone的时区差。
def getutc_offset(): timestamp = time.time() time_now = datetime.fromtimestamp(timestamp) time_utc = datetime.utcfromtimestamp(timestamp) offset = int((time_now -time_utc).total_seconds() / 3600) return offset |
从UTC字符串获得一个datetime结构,用函数
datetime.strptime(start_time_str, UTC_FORMAT),第一个参数是时间字符串,如”2017-04-21T05:58:08.515198Z“,第二个是该时间的格式字符串,如”%Y-%m-%dT%H:%M:%S.%fZ”
对于一个UTC时间转换来的datetime类型,先设置其tzinfo为0时区,然后重置时区对象为local tzinfo.
local_time = datetime.strptime(start_time_str, UTC_FORMAT).replace(tzinfo = zerotz) .astimezone(tz) |
注意:
date.strftime(),该函数,生成指定格式的字符串,对于在1900年之前的日期不能使用。
Wish you happy with python:)
相关文章推荐
- 快乐Python快速上手系列10 - 中文编码问题
- 快乐Python快速上手系列0 - Python Tips
- 快乐Python快速上手系列1 - CSV操作
- 快乐Python快速上手系列2 - XML文件读写
- 快乐Python快速上手系列5 - Excel文件处理
- 快乐Python快速上手系列7 - 动态获得类属性
- 快乐Python快速上手系列9 - 界面Tkinter编程
- 【量化小讲堂-Python&Pandas系列01】如何快速上手使用Python进行金融数据分析
- Python+Django+SAE系列教程6-----本地配置Django
- Flex快速入门系列之五:crossdomain.xml文件创建以及允许本地跨域访问远程资源
- 《Python 编程快速上手 — 让繁琐工作自动化》读书笔记之【第13章 处理PDF和Word文档(2)】
- 【转】.Net程序员玩转Android系列之三~快速上手
- Python如何快速上手? 快速掌握一门新语言的方法
- python之lxml快速上手_Element(二)
- 《Python 编程快速上手 — 让繁琐工作自动化》读书笔记之【第16章 发送电子邮件和短信(1)】
- 使用 mongodb 的 Docker Image 快速上手系列 lab
- JavaScript 、Python Java、Go算法系列之【快速排序】篇
- 【原创】ASP.NET Web 应用开发实战快速上手系列 1——配置环境及预备知识(框架、VS、C#)
- 常用的Python库和示例代码(快速上手)
- Python快速上手(一)