一、
python里的时间戳转时间,UTC时间和local时间的对等转换
通常时间戳都是十位,有时为了需求会转化为13位的,但是在转化为时间的时候必须要转化为十位的。
import time
from datetime import datetime
from datetime import timedelta
time_stamp = 1525848792
loc_time = time.localtime(time_stamp)
time1 = time.strftime("%Y-%m-%d %H:%M:%S",loc_time)
utc_time = datetime.utcfromtimestamp(time_stamp)
time2 = utc_time + timedelta(hours=8)
print(time1)
print(time2)
由于我们是在东八区,utc时间是在本初子午线,也就是在我们西边八个时区,所以要加上八个小时。结果如下:
2018-05-09 14:53:12
2018-05-09 14:53:12
[Finished in 0.1s]
二、
详解time模块中 UTC世界时间、时间戳、字符串三者的转换
# 本地时间 转换 为时间戳
import time
import pytz
import datetime
date_=datetime.datetime(2018,6,19,20,55,00)
timestamp2=time.mktime(date_.timetuple()) #date_.timetuple() 将datetime格式的转化为time模块的tuple格式
print(timestamp2)
#时间戳转换为本地时间
ltime=time.localtime(1529112900) #time.struct_time(tm_year=2018, tm_mon=6, tm_mday=16, tm_hour=9, tm_min=35, tm_sec=0, tm_wday=5, tm_yday=167, tm_isdst=0)
timeStr=time.strftime("%Y-%m-%d %H:%M:%S", ltime)
print(timeStr)
# UTCS时间转换为时间戳 2018-07-13T16:00:00Z
def utc_to_local(utc_time_str, utc_format='%Y-%m-%dT%H:%M:%SZ'):
local_tz = pytz.timezone('Asia/Chongqing') #定义本地时区
local_format = "%Y-%m-%d %H:%M:%S" #定义本地时间format
utc_dt = datetime.datetime.strptime(utc_time_str, utc_format) #讲世界时间的格式转化为datetime.datetime格式
local_dt = utc_dt.replace(tzinfo=pytz.utc).astimezone(local_tz) #想将datetime格式添加上世界时区,然后astimezone切换时区:世界时区==>本地时区
#time_str = local_dt.strftime(local_format) #将datetime格式转化为str—format格式
#return int(time.mktime(time.strptime(time_str, local_format))) #运用mktime方法将date—tuple格式的时间转化为时间戳;time.strptime()可以得到tuple的时间格式
return int(time.mktime(local_dt.timetuple())) #返回当地时间戳
# 本地时间转换为UTC 传入的本地时间戳 1531411200
def local_to_utc(local_ts, utc_format='%Y-%m-%dT%H:%MZ'):
local_tz = pytz.timezone('Asia/Chongqing') #定义本地时区
local_format = "%Y-%m-%d %H:%M:%S" #定义本地时间format
time_str = time.strftime(local_format, time.localtime(local_ts)) #首先将本地时间戳转化为时间元组,用strftime格式化成字符串
dt = datetime.datetime.strptime(time_str, local_format) #将字符串用strptime 转为为datetime中 datetime格式
local_dt = local_tz.localize(dt, is_dst=None) #给时间添加时区,等价于 dt.replace(tzinfo=pytz.timezone('Asia/Chongqing'))
utc_dt = local_dt.astimezone(pytz.utc) #astimezone切换时区
return utc_dt.strftime(utc_format) #返回世界时间格式
print(utc_to_local('2018-07-13T16:00:00Z', utc_format='%Y-%m-%dT%H:%M:%SZ'))
print(local_to_utc(1531411200, utc_format='%Y-%m-%dT%H:%MZ'))
'''
1529412900.0
2018-06-16 09:35:00
1531497600
2018-07-12T16:00Z
'''
三、
操作 MongoDB 时候出现了时区转换的问题,导致 Python 的时间对象存到 MongoDB 转成了 UTC 时间的格式,但是使用 Golang 查询时候与本地时间相差了 8 小时,所以这里写出了 Python 的本地时间与 UTC 时间的转换,Golang 的 MongoDB 驱动会自动做这种转换工作,另一篇参考文章:http://blog.csdn.net/u010649766/article/details/79385948
from datetime import datetime
def utc2local( utc_dtm ):
# UTC 时间转本地时间( +8:00 )
local_tm = datetime.fromtimestamp( 0 )
utc_tm = datetime.utcfromtimestamp( 0 )
offset = local_tm - utc_tm
return utc_dtm + offset
def local2utc( local_dtm ):
# 本地时间转 UTC 时间( -8:00 )
return datetime.utcfromtimestamp( local_dtm.timestamp() )
if __name__ == "__main__":
# utc_tm = datetime.utcnow()
utc_tm = datetime( 2012, 10, 26, 10, 00, 00 )
print( "src utc time:\t", utc_tm.strftime("%Y-%m-%d %H:%M:%S") )
# UTC 转本地
local_tm = utc2local(utc_tm)
print( "tran loc time:\t", local_tm.strftime("%Y-%m-%d %H:%M:%S") )
# 本地转 UTC
utc_tran = local2utc(local_tm)
print( "tran utc time:\t", utc_tran.strftime("%Y-%m-%d %H:%M:%S") )