您的位置:首页 > 编程语言 > Python开发

快乐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模块
包含的类型:

datetime.date
日期,年月日
datetime.datetime
年月日小时分秒毫秒,外加tzinfo,也就是时区信息,这个是重点,
提供了一系列有用的函数,如now(), utcnow(), fromtimestamp(),

utcfromtimestamp(), strptime()
datetime.timedelta
用来计算date, time, datetime之间的时间差
datetime.tzinfo
timezone相关,用于datetime, time来提供调整过的时间, 这个类,
是一个抽象类,针对每一个时区,需要一个instance与之对应,
具体用法参照下面代码
2. time模块
该模块,主要以 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)
UTC时间格式为:UTC_FORMAT = "%Y-%m-%dT%H:%M:%S.%fZ"
比如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
举例来说,在国内运行,获得的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.

local_time = datetime.strptime(start_time_str, UTC_FORMAT).replace(tzinfo = zerotz)
                                                                                                 .astimezone(tz)
至此,完成UTC到Local Time的转换,反之类似。

注意:
date.strftime(),该函数,生成指定格式的字符串,对于在1900年之前的日期不能使用。

Wish you happy with python:)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: