在 Python 中,datetime 模块提供了强大的日期和时间处理功能,strftime() 和 strptime() 是用于格式化日期字符串和解析日期字符串的核心方法。
以下是关于 Python 中日期格式化的详细指南:
基本用法
1 将 datetime 对象格式化为字符串 (strftime)
strftime(format) 将 datetime 对象转换为指定格式的字符串。
from datetime import datetime
# 获取当前时间
now = datetime.now()
# 格式化日期字符串
formatted_date = now.strftime("%Y-%m-%d %H:%M:%S")
print(formatted_date) # 输出示例: 2026-10-25 14:30:45
# 其他常见格式
print(now.strftime("%Y年%m月%d日")) # 2026年10月25日
print(now.strftime("%A, %B %d, %Y")) # Wednesday, October 25, 2026
print(now.strftime("%Y-%m-%d")) # 2026-10-25
print(now.strftime("%H:%M")) # 14:30
2 将字符串解析为 datetime 对象 (strptime)
strptime(date_string, format) 将符合特定格式的字符串解析为 datetime 对象。
from datetime import datetime # 日期字符串 date_string = "2026-10-25 14:30:45" # 解析为 datetime 对象 parsed_date = datetime.strptime(date_string, "%Y-%m-%d %H:%M:%S") print(parsed_date) # 2026-10-25 14:30:45 print(type(parsed_date)) # <class 'datetime.datetime'>
常用格式代码表
| 格式代码 | 说明 | 示例 |
|---|---|---|
%Y |
四位年份 | 2026 |
%y |
两位年份 | 23 |
%m |
月份(零填充) | 01-12 |
%B |
月份全称 | January, October |
%b / %h |
月份缩写 | Jan, Oct |
%d |
日期(零填充) | 01-31 |
%A |
星期全称 | Monday, Wednesday |
%a |
星期缩写 | Mon, Wed |
%H |
24小时制小时 | 00-23 |
%I |
12小时制小时 | 01-12 |
%M |
分钟 | 00-59 |
%S |
秒 | 00-59 |
%p |
AM/PM | AM, PM |
%f |
微秒 | 000000-999999 |
%Z |
时区名称 | UTC, CST |
%z |
时区偏移 | +0800, -0500 |
%j |
一年中的第几天 | 001-366 |
%U / %W |
一年中的第几周 | 00-53 |
常见应用场景
1 获取当前日期并格式化
from datetime import datetime
today = datetime.now()
# ISO 8601 格式
iso_format = today.isoformat()
print(iso_format) # 2026-10-25T14:30:45.123456
# 自定义格式
custom_format = today.strftime("%Y-%m-%d")
print(custom_format) # 2026-10-25
2 解析不同格式的日期字符串
from datetime import datetime # 解析带时区的日期 date_str1 = "2026-10-25 14:30:45 +08:00" dt1 = datetime.strptime(date_str1, "%Y-%m-%d %H:%M:%S %z") print(dt1) # 解析中文日期 date_str2 = "2026年10月25日" dt2 = datetime.strptime(date_str2, "%Y年%m月%d日") print(dt2) # 解析英文日期 date_str3 = "October 25, 2026" dt3 = datetime.strptime(date_str3, "%B %d, %Y") print(dt3)
3 日期计算与格式化结合
from datetime import datetime, timedelta
# 当前时间
now = datetime.now()
# 昨天
yesterday = now - timedelta(days=1)
print(yesterday.strftime("%Y-%m-%d"))
# 明天
tomorrow = now + timedelta(days=1)
print(tomorrow.strftime("%Y-%m-%d"))
# 一周前
last_week = now - timedelta(weeks=1)
print(last_week.strftime("%Y-%m-%d %A"))
使用 dateutil 库处理复杂日期格式
对于非标准格式的日期,可以使用 python-dateutil 库:
pip install python-dateutil
from dateutil import parser
# 自动识别多种日期格式
date1 = parser.parse("2026-10-25")
date2 = parser.parse("October 25, 2026")
date3 = parser.parse("25/10/2026") # 注意:这可能因区域设置而异
print(date1)
print(date2)
print(date3)
注意事项
- 时区处理:
datetime对象可以是 naive(无时区)或 aware(有时区),建议使用pytz或zoneinfo(Python 3.9+)处理时区。 - 异常处理:
strptime()在格式不匹配时会抛出ValueError,建议添加异常处理。 - 性能考虑:
strptime()和strftime()是纯 Python 实现,对于大量数据处理,考虑使用pandas或其他高性能库。
from datetime import datetime
try:
dt = datetime.strptime("invalid-date", "%Y-%m-%d")
except ValueError as e:
print(f"日期解析错误: {e}")
Python 3.7+ 的 datetime.fromisoformat()
对于 ISO 8601 格式的字符串,可以使用更简洁的方法:
from datetime import datetime
# 解析 ISO 格式
dt = datetime.fromisoformat("2026-10-25T14:30:45")
print(dt)
# 格式化回 ISO 格式
formatted = dt.isoformat()
print(formatted)
这些方法涵盖了 Python 中日期格式化的主要使用场景,根据你的具体需求选择合适的格式代码和方法即可。
首发原创文章,作者:世雄 - 原生数据库架构专家,如若转载,请注明出处:https://idctop.com/article/479326.html



