首页 > 技术文章 > Python时间戳和时间类型及其互相转换

sablier 2021-01-08 14:58 原文

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)

推荐阅读