目录
- 需求
- 对于time模块的写法
- 对于datetime模块的写法
- 对于calendar模块的使用
- 怎么区分strptime和strftime
- 结语
需求
业务逻辑中通常会遇到下述两个需求:
- 字符串转换为时间戳
- 时间戳转换为字符串
对于time模块的写法
import time
time_str = "2022-09-27 17-35-35"
time_seconds = time.time()
#字符串转时间戳
time.mktime(time.strptime(time_str, "%Y-%m-%d %H-%M-%S"))
#时间戳转字符串
time.strftime("%Y-%m-%d %H-%M-%S", time.localtime(time_seconds))
对于datetime模块的写法
import time
import datetime
time_str = "2022-09-27 17-35-35"
time_stamps = 11111111
#datetime.datetime.now()获得当前时间的datetime对象
datetime_obj1 = datetime.datetime.now() # datetime.datetime(2022, 9, 27, 19, 15, 2, 523000)
# 将字符串解析为atetime.datetime对象,再转换为时间戳
datetime_obj2 = datetime.datetime.strptime(time_str, "%Y-%m-%d %H-%M-%S")
time_stamps1 = time.mktime(datetime_obj2 .timetuple())
print(time_stamps1) # 输出 1664271335.0
#将时间戳转换为字符串,带时区
datetime_obj3 = datetime.datetime.fromtimestamp(time_stamps)
print(datetime_obj3) # 这里可以直接打印,会有默认的格式 这里输出 1970-05-09 22:25:11
time_str1 = datetime.datetime.strftime(datetime_obj3, "%Y-%m-%d %H-%M-%S") # 转换为指定的格式
print(time_str1) # 输出 1970-05-09 22-25-11
#格林威治时间转换,不带时区
datetime_obj4 = datetime.datetime.utcfromtimestamp(time_stamps ) # datetime.datetime(1970, 5, 9, 14, 25, 11)
如果是在东8时区(中国),datetime_obj3和datetime_obj4相差8小时
对于calendar模块的使用
import calendar
time_str = "2022-09-27 17-35-35"
datetime_obj = datetime.datetime.strptime(time_str, "%Y-%m-%d %H-%M-%S")
time_stamps = calendar.timegm(datetime_obj.timetuple())
print(time_stamps) # 输出 1664300135,这个是格林威治时间
怎么区分strptime和strftime
对于使用过这两个函数的同学,可能会存在这么一个困惑,怎么记住这两个函数呢,一个是从字符串转换到时间戳会用到,一个是从时间戳转换到字符串会用到;可以这么理解,首先是strptime,p代表parse,单词的意思是作语法分析 、作句法分析;代表着解析我么定义的类型,例如 "2022-09-28 09-47-18"这种形式,所以strptime是从字符串转化为时间戳会用到的接口;对于strftime,f对应format,单词意思是格式化,格式化成为我们适合看的类型;所以strftime是时间戳转换为字符串会用到的接口。
结语
其实一般用time模块就可以很好的实现时间戳和字符串之间的转换,不过detetime模块结合time模块一起使用,会更方便一些