Python utc转化时间

发布时间:2019-09-13 09:25:16编辑:auto阅读(1955)

    最近在开发项目的时候, 遇到了时区, 本地时间和UTC糅杂的情况, 研究之后做一些分享.

    UTC Universal Time Coordinated  又叫协调世界时,  UTC用数值记录了时间. 时间记录的是0时区从1972年开始共计走过了多少秒.  所以本地时间与UTC时间的转换需要考虑时差. 


    一般说来, UTC时间的计算不外乎三种情况.

    1: UTC  <-----> UTC

    2: UTC  -----> LocalTime

    3: LocalTime  ------>  UTC


    第一种情况,处理比较简单, 差值就表示两个时间相差的秒数.   

    比如 utc1 = 1406869066, utc2 =  1406869070  相差4, 也就是这两个时间相差4秒.


    ==========

    第二种情况,  可以利用编程语言中自带的包函数,  比如python的gmtime.

        time = '1407391625'
        print gmtime(float(time))

    输出:

    time.struct_time(

    tm_year=2014, 

    tm_mon=8, 

    tm_mday=7, 

    tm_hour=6, 

    tm_min=7, 

    tm_sec=5, 

    tm_wday=3, 

    tm_yday=219, 

    tm_isdst=0

    )

    这样就把日期转换成方便识别的时期, 但注意, 这个日期是0时区的时刻, localtime还需要加减时区, 比如北京在东八区,那么时差为8小时, 所以此处的小时应该是14点, 而不是6点.


    ===========

    第三种情况

    需要特别注意, 因为不同的函数,处理的结果也是不相同的。

    <span style="font-size:18px;">import calendar
    import time
    import datetime
    d = datetime.datetime(2010, 10, 10)
    calendar.timegm(d.timetuple())
    1286668800
    time.mktime(d.timetuple())
    1286640000.0
     </span>
    因为calendar.timegm默认这里的2010-10-10 00:00:00是0时区的时刻,而time.mktime则认为这个是你系统的时间,所以会自动处理时差!比如北京时间东八区,这里time.mktime会认为0时区时间是2010-10-09 16:00:00. 

    所以在使用函数时候,要明白自己用来计算的时间到底是哪个时区的。以下以time.mktime来讨论


    localTime ± 时差  = UTC时间. 

    <span style="font-size:18px;">    time = '2014-08-07-01-00-00'
        format_time = strptime(time, "%Y-%m-%d-%H-%M-%S")   # 将字符串时间转为标准格式时间
        utc_time = mktime(format_time)
        print utc_time</span>
    输出:

    1407391407.0

    **** 

    需要注意的是, mktime会自动获取本机时区, 而帮我计算时差. 所以本地时间转换为utc很方便,  但如果出现了这种情况: 你在东八区, 需要处理来自西五区的一个日志文件(楼主所遇到的情况) 那么就需要手动为这个时差做处理, 否则机器会自动以本地时差处理. 那么就产生了13小时的误差. 所以以上代码改为:

    <span style="font-size:18px;">    time = '2014-08-07-01-03-27'
        format_time = strptime(time, "%Y-%m-%d-%H-%M-%S")
        utc_time = mktime(format_time)  + 3600*13             # 处理时差
        print utc_time</span>


    参考资料: 戳这里

关键字