utc_to_local

有时候我们在存储数据的时候都会采用Datetime的时间类型,往往会采用UTC时间,这时候我们在采用数据的时候需要转换UTC和本地UTC时间


目前知道的应该有三种方法

  1. 简单粗暴直接加8个小时

# Datetime utc to 'Asia/Shanghai'
# Eg: UTC  
# utc_dt = datetime.datetime(2017, 11, 29, 16, 10, 58)
$ local_dt = utc_dt + datetime.timedelta(hours=8)
# result:  datetime.datetime(2017, 11, 30, 0, 10, 58)
  1. 利用第三方模块 pytztzlocal

$ dt =  datetime.datetime(2017, 11, 30, 0, 10, 58)
# 给datetime时间附上timezone
$ tz = tzlocal.get_localzone() #获取本地timezone
$ utc = pytz.utc #获得UTC timezone
$ utc_dt = tz.localize(utc) #给datetime贴上timezone
$ local_dt = local_dt.astimezone(tz) #转换到新的timezone

参考

  1. datetime模块中的tzinfo

tzinfo是一个关于时区信息的类,是一个抽象类所以不能直接被实例化

#! /usr/bin/python
# coding=utf-8

from datetime import datetime, tzinfo,timedelta


class UTC(tzinfo):
    """UTC"""
    def __init__(self,offset = 0):
        self._offset = offset

    def utcoffset(self, dt):
        return timedelta(hours=self._offset)

    def tzname(self, dt):
        return "UTC +%s" % self._offset

    def dst(self, dt):
        return timedelta(hours=self._offset)

#北京时间
beijing = datetime(2011,11,11,0,0,0,tzinfo = UTC(8))
#曼谷时间
bangkok = datetime(2011,11,11,0,0,0,tzinfo = UTC(7))

#北京时间转成曼谷时间
beijing.astimezone(UTC(7))
#计算时间差时也会考虑时区的问题
timespan = beijing - bangkok

[参考](https://www.cnblogs.com/goodspeed/archive/2011/11/07/python_tzinfo.html