Python 时间戳转换的时区问题


背景

本文基于python 3.6 使用datetime模块来解决问题
这个话题起源于客户的一个需求 发过来的时间戳是以1970年1月1日0点为计时起点时间的
所以本文探究了一下时区对转换的影响

Unix时间戳

这里要讲一下Unix时间戳
在 1971 年,《Unix Programmer's Manua》出版,将格林威治时间(GMT)1971年1月1日0时0分0秒作为系统的起始时间。后来为方便记忆和计算,起始时间修改成 1970 年。现今的计算机系统,或多或少受 Unix 的影响,延续 Unix 的计时方式。从此之后 (GMT)1970年1月1日0时0分0秒 就成为 Unix 世界的起始时间,甚至超越 Unix 而成为整个计算机世界的起始时间。
Unix 中常常使用一个数字记录时间,表示距离起始时间相差的秒数(根据系统的精度,时间单位有时毫秒,有时是纳秒)。大于 0 表示在起始时间之后,小于 0 就表示在起始时间之前。这个数字有时是浮点类型、有时是整数类型,但都称这个数字为 Unix 时间戳(Timestamp)。

# -*- coding: utf-8 -*-

from datetime import datetime, timedelta, timezone


def date_time_vision_test1( stamp):
    msgtime = int(stamp)
    logstime = datetime.utcfromtimestamp(msgtime)
    logstime = logstime.strftime("%Y-%m-%d %H:%M:%S")
    return logstime

def date_time_vision_test2( stamp):
    msgtime = int(stamp)
    logstime = datetime.fromtimestamp(msgtime, tz=None)
    logstime = logstime.strftime("%Y-%m-%d %H:%M:%S")
    return logstime
def date_time_vision_test3( stamp):
    msgtime = int(stamp)
    logstime = datetime.fromtimestamp(msgtime)
    logstime = logstime.strftime("%Y-%m-%d %H:%M:%S")
    return logstime
def date_time_vision_test4( stamp):
    msgtime = int(stamp)
    logstime = datetime.utcfromtimestamp(msgtime).replace(tzinfo = timezone.utc).astimezone(tz = None )
    logstime = logstime.strftime("%Y-%m-%d %H:%M:%S")
    return logstime

ts = datetime.now().timestamp()

print(ts)
print( date_time_vision_test1( ts ))
print( date_time_vision_test2( ts ))
print( date_time_vision_test3( ts ))
print( date_time_vision_test4( ts ))

运行结果

1632730591.840916
2021-09-27 08:16:31
2021-09-27 16:16:31
2021-09-27 16:16:31
2021-09-27 16:16:31

总结

通过以上测试
我们可以看到datetime的接口使用utc获取的就是0时区
需要消除时区的影响


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM