11月30, 2017

UTC转换到本地时间

有时候我们在存储数据的时候都会采用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)
    
  2. 利用第三方模块 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
    

    参考

  3. 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

参考

本文链接:http://www.senlief.com/post/utc-to-local.html

-- EOF --

Comments