背景故事
在日常工作中经常会遇到 python 时间格式转换问题,如时间戳转换为格式化时间、格式化时间转换为时间戳,这里做个总结。
在总结之前我们需要先弄清楚一个关键🔑点:时区
时区:我们通常使用的时区一般分为
UTC
时间和UTC+8 (东八)
时间,东八 CT — 中国标准时间 简单理解为中国时间,UTC WET — 欧洲西部时区,GMT - 格林威治标准时间,简单理解为英国时间。东八时间比 UTC 时间快八小时。世界时区图
格式化时间转化为时间戳
获取本地(东八)时间戳
import time
import pytz
import datetime
# 返回 东八 时间戳
def get_shanghai_timestamp(date_time):
time_zone = pytz.timezone('Asia/Shanghai')
timeArray = datetime.datetime.strptime(date_time, "%Y-%m-%d %H:%M:%S")
local_dt = timeArray.astimezone(time_zone)
print('>>>', int(time.mktime(local_dt.timetuple())))
get_timestamp('2018-07-13 16:00:00')
获取 UTC 时间戳
import time
import pytz
import datetime
# 返回 utc 时间戳
def get_utc_timestamp(utc_time_str, utc_format=r'%Y-%m-%d %H:%M:%S'):
local_tz = pytz.timezone('UTC') # 定义本地时区(东八时间比 utc 时间快8小时)
utc_dt = datetime.datetime.strptime(utc_time_str, utc_format) #将世界时间的格式转化为datetime.datetime格式
local_dt = utc_dt.astimezone(local_tz) #想将datetime格式添加上世界时区,然后astimezone切换时区:世界时区==>本地时区
return int(time.mktime(local_dt.timetuple())) #返回当地时间戳
print(get_utc_timestamp('2018-07-13 16:00:00', utc_format='%Y-%m-%d %H:%M:%S'))
时间戳转换为格式化时间
返回东八格式化时间
# 方式一:
import time
import pytz
import datetime
def get_local_format_time(timestamp):
local_time=time.localtime()
format_time=time.strftime("%Y-%m-%d %H:%M:%S", local_time)
return format_time
get_local_format_time(1529112900)
# 方式二:
def local_to_utc(local_ts, time_format=r'%Y-%m-%d %H:%M:%S'):
time_zone = pytz.timezone('Asia/Shanghai')
time_str = time.strftime(time_format, time.localtime(local_ts)) #首先将本地时间戳转化为时间元组,用strftime格式化成字符串
dt = datetime.datetime.strptime(time_str, time_format) #将字符串用strptime 转为为datetime中 datetime格式
utc_dt = dt.astimezone(time_zone) # astimezone切换为 utc 时区
return utc_dt.strftime(time_format) #返回 utc 格式化时间
get_local_format_time(1529112900)
返回 UTC 格式化时间
def get_utc_format_time(local_ts, time_format=r'%Y-%m-%d %H:%M:%S'):
time_str = time.strftime(time_format, time.localtime(local_ts)) #首先将本地时间戳转化为时间元组,用strftime格式化成字符串
dt = datetime.datetime.strptime(time_str, time_format) #将字符串用strptime 转为为datetime中 datetime格式
utc_dt = dt.astimezone(pytz.utc) # astimezone切换为 utc 时区
return utc_dt.strftime(time_format) #返回 utc 格式化时间
get_utc_format_time(1529112900)