Python3 日期和时间:从入门到实战
在编写程序时,我们常常需要处理时间相关的任务:记录日志的时间戳、计算任务耗时、解析用户输入的日期、生成动态内容的时间标签……这些场景背后,都离不开对“日期和时间”的精准操控。而 Python3 提供了强大的 datetime 模块,让我们能够轻松应对各种时间操作需求。
如果你正在学习 Python,或者已经写过一些脚本但对时间处理感到困惑,那么这篇文章就是为你准备的。我们将从基础概念讲起,逐步深入到实际应用,帮助你建立完整的知识体系。
日期和时间的基本类型
Python3 中处理时间的核心是 datetime 模块。它提供了多个类,分别代表不同的时间粒度。理解这些类的关系,是掌握 Python3 日期和时间的第一步。
datetime 类:时间的“全息记录”
datetime 类可以同时包含日期和时间信息,是处理时间最常用的对象。它由年、月、日、时、分、秒、微秒组成。
from datetime import datetime
now = datetime.now()
print(now) # 输出类似:2025-04-05 10:23:45.123456
specific_time = datetime(2025, 4, 5, 10, 23, 45)
print(specific_time) # 输出:2025-04-05 10:23:45
💡 小贴士:你可以把
datetime想象成一个“时间身份证”——它不仅记录了“什么时候”,还精确到“几点几分几秒”,甚至精确到微秒,非常适合用于日志、事务记录等需要高精度的场景。
date 类:只关心“哪一天”
当你只需要处理日期,不关心具体时间时,可以使用 date 类。它只包含年、月、日三个部分。
from datetime import date
today = date.today()
print(today) # 输出:2025-04-05
birth_date = date(1990, 5, 15)
print(birth_date) # 输出:1990-05-15
📌 比喻:
date就像你的身份证上的出生日期,只记录“哪一天”,不关心“几点出生”。
time 类:专注“几点几分几秒”
time 类专门用于表示一天中的某个时间点,不包含日期信息。
from datetime import time
meeting_time = time(14, 30, 0) # 14点30分0秒
print(meeting_time) # 输出:14:30:00
event_time = time(9, 15, 30, 500000)
print(event_time) # 输出:09:15:30.500000
✅ 适用场景:比如安排会议时间、闹钟提醒,你只需要知道“几点”,不需要知道“哪一天”。
常见的时间操作与格式化
在实际开发中,我们经常需要将时间对象转换为字符串(比如显示给用户),或从字符串解析出时间对象(比如用户输入)。这就涉及格式化与解析。
时间格式化:让时间“好看”一点
使用 strftime() 方法可以将 datetime 对象转换为指定格式的字符串。
from datetime import datetime
now = datetime.now()
print(now.strftime("%Y-%m-%d %H:%M:%S")) # 2025-04-05 10:23:45
print(now.strftime("%B %d, %Y")) # April 05, 2025
print(now.strftime("%A, %I:%M %p")) # Friday, 10:23 AM
| 格式代码 | 含义 |
|---|---|
%Y |
四位年份(如 2025) |
%y |
两位年份(如 25) |
%m |
月份(01–12) |
%B |
完整月份名(如 April) |
%b |
缩写月份名(如 Apr) |
%d |
日期(01–31) |
%H |
小时(00–23,24小时制) |
%I |
小时(01–12,12小时制) |
%M |
分钟(00–59) |
%S |
秒(00–59) |
%p |
AM/PM |
📌 提示:这些格式代码就像“时间密码”,你只要记住它们的含义,就能自由组合出想要的显示格式。
时间解析:从字符串还原时间
反过来,使用 strptime() 可以将符合特定格式的字符串转换为 datetime 对象。
from datetime import datetime
input_str = "2025-04-05 14:30:00"
parsed_time = datetime.strptime(input_str, "%Y-%m-%d %H:%M:%S")
print(parsed_time) # 输出:2025-04-05 14:30:00
date_str = "April 5, 2025"
parsed_date = datetime.strptime(date_str, "%B %d, %Y")
print(parsed_date) # 输出:2025-04-05 00:00:00
⚠️ 注意:格式字符串必须与输入字符串完全匹配,否则会抛出
ValueError。这是初学者最容易出错的地方。
时间差计算:精确测量“时间流逝”
在很多场景中,我们需要计算两个时间点之间的差值,比如计算任务执行时间、用户注册距今多久等。Python3 提供了 timedelta 类来处理时间差。
timedelta:时间的“增量单位”
timedelta 表示两个时间之间的差值,可以是正数也可以是负数。
from datetime import datetime, timedelta
now = datetime.now()
future = now + timedelta(days=7)
print(f"7天后是:{future.strftime('%Y-%m-%d')}")
later = now + timedelta(hours=2, minutes=30)
print(f"2小时30分钟后是:{later.strftime('%H:%M:%S')}")
one_month_ago = now - timedelta(days=30)
print(f"一个月前是:{one_month_ago.strftime('%Y-%m-%d')}")
🔄 重要提醒:
timedelta的days、hours、minutes等参数是累加关系,而不是“自动换算”。比如timedelta(hours=25)就是 25 小时,不会自动变成 1 天 1 小时。
实际应用:生成日志时间戳
我们来看一个真实的开发场景:为日志文件添加时间戳。
from datetime import datetime
def log_message(message):
# 获取当前时间并格式化
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
# 输出带时间戳的日志
print(f"[{timestamp}] {message}")
log_message("程序启动成功")
log_message("用户登录成功")
log_message("数据备份完成")
输出结果:
[2025-04-05 10:23:45] 程序启动成功
[2025-04-05 10:23:46] 用户登录成功
[2025-04-05 10:23:47] 数据备份完成
✅ 这种方式在日志系统、API 接口、自动化脚本中非常常见。它让你能清晰地知道每个事件发生的精确时间。
高级技巧:时区处理与时间转换
在跨时区应用中,仅仅处理本地时间是不够的。Python3 也支持时区感知的时间。
引入时区:让时间“有归属”
from datetime import datetime, timezone, timedelta
utc_time = datetime.now(timezone.utc)
print("UTC 时间:", utc_time)
beijing_tz = timezone(timedelta(hours=8))
beijing_time = datetime.now(beijing_tz)
print("北京时间:", beijing_time)
utc_time = datetime(2025, 4, 5, 10, 0, 0, tzinfo=timezone.utc)
beijing_time = utc_time.astimezone(timezone(timedelta(hours=8)))
print("UTC 10:00 转为北京时间:", beijing_time)
🌍 提示:时区处理是进阶内容,但如果你开发的是 Web 应用、API 服务,强烈建议从一开始就考虑时区问题,避免用户看到错误时间。
总结:掌握 Python3 日期和时间的关键
Python3 日期和时间功能强大而灵活,从简单的 datetime.now() 到复杂的时区转换,覆盖了绝大多数开发场景。关键在于:
- 理解
datetime、date、time三者的区别与适用场景; - 掌握
strftime和strptime的格式代码,实现自由格式化; - 使用
timedelta精确计算时间差; - 在实际项目中,尽早考虑时区问题,避免“时间错乱”;
- 多写代码练习,尤其注意格式字符串的匹配。
本文通过理论结合实践,带你系统掌握 Python3 日期和时间的核心技能。无论是写脚本、做日志、处理用户输入,还是开发 Web 应用,这些知识都将为你打下坚实基础。
希望你能从这篇文章中获得实用价值,让时间管理成为你编程能力的一部分。继续探索,代码之路,越走越顺。