目录

  • 需求
  • 对于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模块一起使用,会更方便一些