Python时间戳和时间类型及其互相转换
1 常用的时间模块
time是模块提供的功能是更加接近于操作系统层面的。time 模块是围绕着 Unix Timestamp 进行的。
该模块主要包括一个类 struct_time,另外其他几个函数及相关常量。 需要注意的是在该模块中的大多数函数是调用了所在平台C library的同名函数, 所以要特别注意有些函数是平台相关的,可能会在不同的平台有不同的效果。
import time
time_str = "2020-12-31 09:30:18"
t_struct = time.strptime(time_str, "%Y-%m-%d %H:%M:%S") # 生成time_str对应的struct_time对象
t_str = time.strftime("%Y-%m-%d %H:%M:%S", t_struct) # 生成t_struct对应格式的字符串时间
t_stamp = time.mktime(t_struct) # 生成t_struct对应的时间戳
print(t_struct)
print(t_str)
print(t_stamp)
# struct_time有以下常用属性
print(t_struct.tm_year) # 年份
print(t_struct.tm_mon) # 月份
print(t_struct.tm_mday) # 日期
print(t_struct.tm_wday) # 星期
print(t_struct.tm_hour) # 小时
print(t_struct.tm_min) # 分钟
print(t_struct.tm_sec) # 秒钟
datetime可以理解为对 time 进行了封装,提供了更多实用的函数。在datetime 模块中包含了几个类:
- timedelta 主要用于计算时间跨度
- tzinfo 时区相关
- time 只关注时间
- date只关注日期
- datetime 同时有时间和日期
关系型数据库DateTime类型在python对应的类型为datetime.datetime类型
import datetime
time_stamp = 1609378218
time_str = "2020-12-31 09:30:18"
dd_struct = datetime.datetime.strptime(time_str,"%Y-%m-%d %H:%M:%S") # 转化为struct_time对象
dd_obj = datetime.datetime.fromtimestamp(time_stamp) # 将时间戳转换为datetime
dd_struct1 = dd_obj.timetuple() # 将datetime对象转化为struct_time对象
dd_str = dd_obj.strftime("%Y-%m-%d %H:%M:%S") # 将datetime对象转化为str格式
dd_stamp = dd_obj.timestamp() # 将datetime对象转为时间戳
print(dd_struct)
print(dd_obj)
print(dd_struct1)
print(dd_str)
print(dd_stamp)
# 所有datetime下的时间类型都有timetuple()方法可以将其转化为struct_time对象,进而可以用time模块将其转换为任意类型
date_obj = datetime.date(year=2020, month=12, day=31)
time_obj = datetime.time(hour=9, minute=30, second=18)
datetime_obj = datetime.datetime(year=2020, month=12, day=31, hour=9, minute=30, second=18)
# datetime对象有以下常用属性
print(datetime_obj.year) # 年份
print(datetime_obj.month) # 月份
print(datetime_obj.day) # 日期
print(datetime_obj.hour) # 小时
print(datetime_obj.minute)# 分钟
print(datetime_obj.second)# 秒种
2. 常用时间类型之间的转换
常用的时间类型有 时间戳(int/float),struct_time对象,datetime.date对象,datetime.datetime对象
2.1 Str格式 和 时间戳
# 使用time 由 str 转换为 时间戳
timeStr = '2020-12-31 09:30:18'
timeArray = time.strptime(timeStr, "%Y-%m-%d %H:%M:%S")
timeStamp = time.mktime(timeArray)
print(timeStamp) # 1609378218.0
# 使用datetime 由 str 转换为 时间戳
dateArray = datetime.datetime.strptime(timeStr, "%Y-%m-%d %H:%M:%S")
timeStamp = dateArray.timestamp()
print(timeStamp) # 1609378218.0
# 使用time 由 时间戳 转换为 str
timeStamp = 1609378218
timeArray = time.localtime(timeStamp)
timeStr = time.strftime("%Y-%m-%d %H:%M:%S", timeArray)
print(timeStr) # 2020-12-31 09:30:18
# 使用datetime 由 时间戳 转换为 str
dateArray = datetime.datetime.fromtimestamp(timeStamp)
timeStr = dateArray.strftime("%Y-%m-%d %H:%M:%S")
print(timeStr) # 2020-12-31 09:30:18
2.2 datetime对象和时间戳
# 由 时间戳 转换为 datetime对象 (转换为 str格式)
timeStamp = 1609378218
dateArray = datetime.datetime.fromtimestamp(timeStamp)
timeStr = dateArray.strftime("%Y-%m-%d %H:%M:%S")
print(timeStr) # 2020-12-31 09:30:18
# 使用datetime,指定utc时间,相差8小时
timeStamp = 1609378218
dateArray = datetime.datetime.utcfromtimestamp(timeStamp)
timeStr = dateArray.strftime("%Y-%m-%d %H:%M:%S")
print(timeStr) # 2020-12-31 09:30:18
# 由 datetime对象 转换为 时间戳
dateArray = datetime.datetime(year=2020, month=12, day=31, hour=9, minute=30, second=18)
timeStamp = dateArray.timestamp()
print(timeStamp) # 1609378218.0
2.3 str类型转换为其他格式的str
# 原始字符类型的时间
ts = '2020-12-31 09:30:18'
# 转为struct_time
timeArray = time.strptime(ts, "%Y-%m-%d %H:%M:%S")
# 转为其它显示格式
timeStr = time.strftime("%Y/%m/%d %H:%M:%S", timeArray)
print(timeStr)
3. 生成特定时间
# time获取当前时间戳
now = int(time.time())
print(now)
# 获取当前时间对象
timeArray = time.localtime(now)
print(timeArray)
# 获取当前时间str
timeStr = time.strftime("%Y-%m-%d %H:%M:%S", timeArray)
print(timeStr)
# datetime获取当前时间
now = datetime.datetime.now()
print(now)
# 获取当前时间str
timeStr = now.strftime("%Y-%m-%d %H:%M:%S")
print(timeStr)
# 获取当前时间戳
timeStamp = now.timestamp()
timeStamp1 = time.mktime(now.timetuple())
print(timeStamp)
print(timeStamp1)
# 获取当天零时时间戳
time_begin = time.mktime(datetime.date.today().timetuple())
print(time_begin)
# 当月第一天零时时间戳
month_begin = datetime.datetime(now.year, now.month, 1, 0, 0, 0)
month_begin = month_begin.timestamp()
print(month_begin)
# 下月第一天零时时间戳
month = now.month
month = 0 if month == 12 else month
future_month_first = datetime.datetime(now.year, month + 1, 1, 0, 0, 0)
future_month_first = future_month_first.timestamp()
print(future_month_first)
# 当月最后一天最后一秒时间戳
month = now.month
month = 0 if month == 12 else month
future_month_first = datetime.datetime(now.year, month + 1, 1, 23, 59, 59)
month_end = future_month_first - datetime.timedelta(days=1)
month_end = month_end.timestamp()
print(month_end)
# 上个月最后一天最后一秒时间戳
this_month_first = datetime.datetime(now.year, now.month, 1, 23, 59, 59)
last_month_last = this_month_first - datetime.timedelta(days=1)
last_month_last = last_month_last.timestamp()
print(last_month_last)