背景
本文基於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時區
需要消除時區的影響