时间处理在程序中无处不在,比如记录日志、设置缓存过期时间、计算任务耗时等。Python 的 time 模块是底层时间操作的基础,它主要处理三种时间表示形式:时间戳、结构化时间和格式化时间。理解这三种形式及它们之间的转换,是处理时间问题的基本功。
时间戳(timestamp)
时间戳是一个浮点数,表示从 1970 年 1 月 1 日 00:00:00(UTC) 到某个时间点经过的秒数(支持小数部分)。它是计算机中最常用的时间表示,方便进行数学运算和跨平台传递。
- 获取当前时间戳:
import time
t = time.time() # 返回当前时间戳,如 1695000000.123456
- 典型用途:
- 计算代码执行耗时:在
start = time.time()和end = time.time()之间求差值。 - 作为唯一标识符(需要考虑并发时可能重复)。
- 与 C 语言交互或进行底层网络通信时使用。
结构化时间(struct_time)
time.struct_time 是一个具有九个命名属性的元组,将时间拆分成人类容易理解的各个部分:年、月、日、时、分、秒、星期几、一年中的第几天、是否夏令时。属性列表如下:
| 索引 | 属性 | 说明 | 取值范围 |
|------|----------|--------------------------|---------------------|
| 0 | tm_year | 年 | 例如 2023 |
| 1 | tm_mon | 月 | 1 ~ 12 |
| 2 | tm_mday | 日 | 1 ~ 31 |
| 3 | tm_hour | 小时 | 0 ~ 23 |
| 4 | tm_min | 分钟 | 0 ~ 59 |
| 5 | tm_sec | 秒 | 0 ~ 61(含闰秒) |
| 6 | tm_wday | 星期几(星期一为0) | 0 ~ 6 |
| 7 | tm_yday | 一年中的第几天 | 1 ~ 366 |
| 8 | tm_isdst | 是否为夏令时 | 1:夏令时,0:非夏令时,-1:未知 |
- 获取当前本地结构化时间:
local = time.localtime() # 返回当前本地时区的 struct_time
print(local.tm_year) # 直接访问属性
- 获取 UTC 时间:
utc = time.gmtime() # UTC 时间的 struct_time
- 典型用途:需要取出具体年、月、日等字段时使用,因为时间戳直接拆分会很麻烦。
格式化时间(时间字符串)
格式化时间是将时间以字符串形式展示,符合人类阅读习惯或接口规范,如 "2025-03-15 14:30:00"。通过格式指令控制输出的样式。
- 将结构化时间转为字符串(格式化):
s = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
# 结果如 "2025-03-15 14:30:00"
- 将字符串解析为结构化时间(解析):
t = time.strptime("2025-03-15 14:30:00", "%Y-%m-%d %H:%M:%S")
# 返回 struct_time 对象
- 常用格式指令:
%Y:四位年份%m:两位月份(01-12)%d:两位日期(01-31)%H:24小时制小时(00-23)%M:分钟(00-59)%S:秒(00-59)%A:星期全称%B:月份全称- 典型用途:日志时间戳、API 返回的时间字段、前端展示。
三种形式之间的互相转换
实际开发中,经常需要在时间戳、结构化时间、字符串之间来回切换。转换思路如下:
- 时间戳 → 结构化时间:
time.localtime(时间戳)或time.gmtime(时间戳) - 结构化时间 → 时间戳:
time.mktime(struct_time)← 注意,它始终将 struct_time 当作本地时间计算 - 结构化时间 → 字符串:
time.strftime(格式, struct_time) - 字符串 → 结构化时间:
time.strptime(字符串, 格式) - 时间戳 → 字符串:先转为结构化时间,再格式化
- 字符串 → 时间戳:先解析为结构化时间,再调用
mktime()
代码示例:获取当前时间并格式化为字符串
import time
now_stamp = time.time()
now_struct = time.localtime(now_stamp)
now_str = time.strftime("%Y-%m-%d %H:%M:%S", now_struct)
print(now_str) # 输出如 "2025-03-15 14:30:00"
代码示例:将时间字符串转为时间戳
import time
time_str = "2025-03-15 14:30:00"
time_struct = time.strptime(time_str, "%Y-%m-%d %H:%M:%S")
stamp = time.mktime(time_struct) # 得到本地时区下的时间戳
通过 time 模块提供的这三种时间表示和转换函数,你可以灵活处理各种时间相关的需求。不过在日常开发中,如果涉及时区、日期算术等更复杂的操作,通常会结合下一节介绍的 datetime 模块一起使用,后者提供了更高级的抽象和便利方法。