前言
一、时间戳与时间元组
1. 时间戳(Timestamp)
2. 时间元组(struct_time)
二、time 模块及操作
1. 常用函数速览
2. 格式化与解析:strftime 与 strptime
三、calendar 模块:日历与日期计算
四、datetime 模块
五、高级工具
1. pytz:强大的时区处理
2. dateutil:智能解析与重复规则
六、建议
小结
前言
在 Python 编程中,处理日期和时间是常见且重要的任务——无论是记录日志、计算时间差、格式化输出,还是处理时区问题。Python 提供了多个模块来应对这些需求,主要包括 time、calendar 和更现代的 datetime 模块。本文将系统性地介绍这些工具的使用方法、核心概念及最佳实践,助你轻松驾驭时间处理。
一、时间戳与时间元组
1. 时间戳(Timestamp)
- 自 1970年1月1日 00:00:00 UTC(Unix 纪元) 起经过的秒数。
- 类型为浮点数,适合进行时间运算。
- 获取当前时间戳:
import time
ticks = time.time()
print("当前时间戳:", ticks) # 如:1738598245.123456
注意:传统 Unix 时间戳受限于 2038 年问题(32 位系统),但 Python 在 64 位系统上通常无此限制,因此大家当做了解历史就行了,但是时间戳还是很有用的。
2. 时间元组(struct_time)
time 模块使用一个包含 9 个元素的元组(或 struct_time 对象)表示本地或 UTC 时间:
| 0 | tm_year | 年 | 如 2026 |
| 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 = time.localtime() # 使用当前时间戳
print(local_time)
# time.struct_time(tm_year=2026, tm_mon=2, tm_mday=3, …)
二、time 模块及操作
1. 常用函数速览
| time.time() | 返回当前时间戳 |
| time.localtime([secs]) | 将时间戳转为本地时间元组 |
| time.gmtime([secs]) | 将时间戳转为 UTC 时间元组 |
| time.mktime(t) | 将时间元组转为时间戳 |
| time.asctime([t]) | 将时间元组转为可读字符串(如 "Tue Feb 3 21:30:00 2026") |
| time.ctime([secs]) | 等价于 asctime(localtime(secs)) |
| time.sleep(seconds) | 暂停程序执行指定秒数 |
2. 格式化与解析:strftime 与 strptime
- strftime(format, t):将时间元组格式化为字符串。
- strptime(string, format):将字符串解析为时间元组。
常用格式符:
| %Y | 四位年份 | 2026 |
| %m | 月份(01–12) | 02 |
| %d | 日期(01–31) | 03 |
| %H | 24小时制小时(00–23) | 21 |
| %M | 分钟(00–59) | 30 |
| %S | 秒(00–59) | 45 |
| %a | 简写星期名 | Tue |
| %A | 全写星期名 | Tuesday |
| %b | 简写月份名 | Feb |
| %B | 全写月份名 | February |
import time
# 格式化当前时间
now = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
print(now) # 2026-02-03 21:30:45
# 解析字符串为时间元组
date_str = "2026-02-03 21:30:45"
t = time.strptime(date_str, "%Y-%m-%d %H:%M:%S")
timestamp = time.mktime(t)
print(timestamp) # 转回时间戳
三、calendar 模块:日历与日期计算
calendar 模块用于生成日历、判断闰年、计算星期等。
常用功能:
import calendar
# 打印某月日历
print(calendar.month(2026, 2))
# 判断是否为闰年
print(calendar.isleap(2024)) # True
# 计算两个年份间的闰年数量
print(calendar.leapdays(2020, 2030)) # 3(2020, 2024, 2028)
# 获取某月第一天是星期几(0=周一)及天数
first_weekday, days_in_month = calendar.monthrange(2026, 2)
print(first_weekday, days_in_month) # 如:6 28(2026年2月1日是周日,共28天)
# 获取某天是星期几
print(calendar.weekday(2026, 2, 3)) # 1(周二)
注意:默认每周从星期一开始,可通过 calendar.setfirstweekday(calendar.SUNDAY) 这个函数实现个人所需修改。
四、datetime 模块
虽然 time 模块功能强大,但 datetime 模块提供了更面向对象、更直观的 API,是当前 Python 日期时间处理的首选。
核心类:
- datetime.date:仅日期(年、月、日)
- datetime.time:仅时间(时、分、秒、微秒)
- datetime.datetime:日期 + 时间
- datetime.timedelta:时间间隔(用于加减)
- datetime.timezone:时区支持(Python 3.2+)
from datetime import datetime, timedelta
# 获取当前日期时间
now = datetime.now()
print(now) # 2026-02-03 21:30:45.123456
# 创建指定日期
dt = datetime(2026, 2, 3, 21, 30, 45)
# 格式化输出
formatted = dt.strftime("%Y-%m-%d %H:%M:%S")
print(formatted) # 2026-02-03 21:30:45
# 解析字符串
parsed = datetime.strptime("2026-02-03 21:30:45", "%Y-%m-%d %H:%M:%S")
# 时间运算
future = now + timedelta(days=7, hours=3)
print(future)
# 日期差
diff = future – now
print(diff.days) # 7
优势:
- 支持自然的时间运算(如 + timedelta)
- 更清晰的对象接口
- 内置时区支持(配合 zoneinfo 或 pytz)
五、高级工具
1. pytz:强大的时区处理
from datetime import datetime
import pytz
utc = pytz.UTC
eastern = pytz.timezone('US/Eastern')
dt = datetime(2026, 2, 3, 21, 30, tzinfo=utc)
eastern_time = dt.astimezone(eastern)
注意:Python 3.9+ 以及之后的都推荐使用标准库 zoneinfo 替代 pytz。
2. dateutil:智能解析与重复规则
from dateutil.parser import parse
from dateutil.relativedelta import relativedelta
# 智能解析各种日期字符串
dt = parse("Feb 3, 2026 at 9:30 PM")
# 相对时间(如“下个月”、“3年后”)
next_month = dt + relativedelta(months=1)
六、建议
小结
Python 提供了从底层 time 模块到高层 datetime 的完整时间处理体系。对于新项目,强烈推荐使用 datetime 模块,它不仅语法简洁,还支持现代开发所需的时区、运算和格式化功能。而 calendar 模块则在需要日历逻辑时大显身手。
“时间是程序中最容易出错的部分之一 —— 用对工具,事半功倍。”
掌握这些模块,你将能从容应对任何与日期时间相关的编程挑战!
希望大家都能够有所收获,大家的点赞和关注是对我最大的支持和帮助!
网硕互联帮助中心





评论前必须登录!
注册