Python 的时间处理功能超级实用,不管你是想记录程序运行时间、处理日期数据,还是做个倒计时小工具,Python 都提供了好用的模块,比如 time
、datetime
和 dateutil
。这篇文章会带你从基础到进阶,逐步搞懂 Python 的时间处理!
参考文章:Python 内置模块 datetime | 简单一点学习 easyeasy.me
1. 时间处理的基础概念
什么是时间戳、日期和时间?
时间戳是个大整数,表示从 1970 年 1 月 1 日 00:00:00 UTC(Unix 纪元)到现在的秒数。日期和时间就更好理解了,比如“2025年8月17日 18:04”就是日期和时间的组合。Python 提供了好几个模块来处理这些东西,核心是 time
和 datetime
。
Python 的时间相关模块简介
time
模块:适合低级别的时间操作,比如获取时间戳、暂停程序。datetime
模块:功能强大,适合处理日期、时间、时区等。dateutil
模块:第三方库,解析复杂日期字符串和高级运算很方便。pytz
模块:专门用来处理时区。
先装好需要的库,尤其是 dateutil
和 pytz
:
pip install python-dateutil pytz
2. 用 time
模块处理时间
time
模块是 Python 的基础时间模块,简单粗暴,适合快速搞定时间戳和基本时间操作。
获取当前时间和时间戳
用 time.time()
获取当前时间戳,单位是秒:
import time
# 获取当前时间戳
timestamp = time.time()
print(f"当前时间戳: {timestamp}")
# 转成人类能看懂的时间
local_time = time.localtime(timestamp)
print(f"本地时间: {local_time}")
输出可能是:
当前时间戳: 1745089440.123456
本地时间: time.struct_time(tm_year=2025, tm_mon=8, tm_mday=17, tm_hour=18, tm_min=4, tm_sec=0, ...)
time.localtime()
返回一个结构体,包含年、月、日、小时等信息。如果想要 UTC 时间,用 time.gmtime()
。
格式化时间字符串
直接看 struct_time
有点晕,我们可以用 time.strftime()
把时间转成好看的字符串:
import time
# 当前时间转成字符串
formatted_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
print(f"格式化时间: {formatted_time}")
输出:
格式化时间: 2025-08-17 18:04:00
格式化符号常见的有:
%Y
:四位年份(2025)%m
:两位月份(08)%d
:两位日期(17)%H
:24小时制小时(18)%M
:分钟(04)%S
:秒(00)
暂停程序(sleep)
想让程序歇一会儿?用 time.sleep()
,单位是秒:
import time
print("开始")
time.sleep(2) # 暂停 2 秒
print("2秒后")
3. 用 datetime
模块处理日期和时间
datetime
模块功能更强大,适合复杂的日期和时间操作。它包含几个核心类:
datetime.date
:处理日期(年月日)datetime.time
:处理时间(时分秒)datetime.datetime
:日期 + 时间datetime.timedelta
:时间差
创建和操作日期对象
创建日期对象很简单:
from datetime import date, datetime
# 今天的日期
today = date.today()
print(f"今天是: {today}")
# 自定义日期
my_birthday = date(2025, 8, 17)
print(f"我的生日: {my_birthday}")
输出:
今天是: 2025-08-17
我的生日: 2025-08-17
datetime
对象可以同时处理日期和时间:
from datetime import datetime
# 当前日期和时间
now = datetime.now()
print(f"现在是: {now}")
# 自定义日期时间
party_time = datetime(2025, 12, 31, 23, 59, 59)
print(f"派对时间: {party_time}")
输出:
现在是: 2025-08-17 18:04:00.123456
派对时间: 2025-12-31 23:59:59
时间运算(加减时间)
用 timedelta
做时间加减法,超级方便:
from datetime import datetime, timedelta
now = datetime.now()
print(f"现在: {now}")
# 加 3 天
three_days_later = now + timedelta(days=3)
print(f"3天后: {three_days_later}")
# 减 2 小时
two_hours_ago = now - timedelta(hours=2)
print(f"2小时前: {two_hours_ago}")
输出:
现在: 2025-08-17 18:04:00.123456
3天后: 2025-08-20 18:04:00.123456
2小时前: 2025-08-17 16:04:00.123456
格式化日期和时间
datetime
对象的 strftime
方法和 time
模块的格式化类似:
from datetime import datetime
now = datetime.now()
formatted = now.strftime("%Y年%m月%d日 %H:%M:%S")
print(f"格式化: {formatted}")
输出:
格式化: 2025年08月17日 18:04:00
反过来,把字符串转回 datetime
对象用 strptime
:
from datetime import datetime
date_str = "2025-08-17 18:04:00"
parsed_date = datetime.strptime(date_str, "%Y-%m-%d %H:%M:%S")
print(f"解析后的时间: {parsed_date}")
时区处理
时区是个容易踩坑的地方,用 pytz
模块可以轻松搞定:
from datetime import datetime
import pytz
# 当前时间(带时区)
tz = pytz.timezone("Asia/Shanghai")
now_shanghai = datetime.now(tz)
print(f"上海时间: {now_shanghai}")
# 转到纽约时间
tz_ny = pytz.timezone("America/New_York")
now_ny = now_shanghai.astimezone(tz_ny)
print(f"纽约时间: {now_ny}")
输出:
上海时间: 2025-08-17 18:04:00+08:00
纽约时间: 2025-08-17 06:04:00-04:00
4. 用 dateutil
模块扩展功能
dateutil
是个超级好用的第三方库,适合处理复杂或不规则的日期时间。
解析模糊日期字符串
dateutil.parser
能解析各种奇奇怪怪的日期字符串:
from dateutil.parser import parse
# 解析各种格式
dates = [
"2025-08-17",
"Aug 17, 2025",
"17/08/2025",
"2025.08.17 18:04"
]
for d in dates:
parsed = parse(d)
print(f"解析 {d}: {parsed}")
输出:
解析 2025-08-17: 2025-08-17 00:00:00
解析 Aug 17, 2025: 2025-08-17 00:00:00
解析 17/08/2025: accepte2025-08-17 00:00:00
解析 2025.08.17 18:04: 2025-08-17 18:04:00
处理复杂的日期运算
dateutil
的 relativedelta
比 timedelta
更灵活,支持按月、年运算:
from datetime import datetime
from dateutil.relativedelta import relativedelta
now = datetime.now()
print(f"现在: {now}")
# 加 1 年 2 个月
future = now + relativedelta(years=1, months=2)
pgprint(f"1年2个月后: {future}")
输出:
现在: 2025-08-17 18:04:00.123456
1年2个月后: 2026-10-17 18:04:00.123456
5. 常见时间处理场景
计算程序运行时间
想知道代码跑了多久?用 time.perf_counter()
:
import time
start = time.perf_counter()
# 模拟耗时操作
time.sleep(1)
end = time.perf_counter()
print(f"程序运行时间: {end - start:.2f} 秒")
输出:
程序运行时间: 1.00 秒
处理文件时间戳
检查文件的创建或修改时间:
import os
from datetime import datetime
file_path = "example.txt"
# 创建一个文件
with open(file_path, "w") as f:
f.write("Hello!")
# 获取文件的修改时间
mtime = os.path.getmtime(file_path)
mtime_dt = datetime.fromtimestamp(mtime)
print(f"文件最后修改时间: {mtime_dt}")
定时任务示例
用 time.sleep
实现简单的定时任务:
import time
from datetime import datetime
def task():
print(f"任务执行时间: {datetime.now()}")
# 每 5 秒执行一次任务,运行 3 次
for _ in range(3):
task()
time.sleep(5)
6. 注意事项和最佳实践
时区问题怎么破?
- 总是用
pytz
处理时区,避免硬编码时间偏移。 - 保存时间时,尽量用 UTC,显示时再转本地时间。
- 注意夏令时(DST),用
pytz
的normalize
方法处理。
性能优化小技巧
- 用
time.perf_counter()
而不是time.time()
来测运行时间,精度更高。 - 批量处理日期时,尽量复用
datetime
对象,避免重复创建。 - 解析大量日期字符串时,
dateutil.parser
可能比datetime.strptime
慢,优先用后者如果格式固定。
常见错误和解决方案
- 错误:字符串格式不匹配
比如datetime.strptime("2025-08-17", "%Y/%m/%d")
会报错。检查格式字符串是否正确。 - 错误:时区未设置
用datetime.now()
拿到的时间没有时区信息,改用datetime.now(pytz.UTC)
。 - 错误:时间戳溢出
32 位系统可能在 2038 年后溢出,尽量用 64 位 Python。