核心概念
Python 的 datetime 模块处理日期和时间时,有两种主要的表示形式:

datetime对象:这是一个 Python 的对象,包含了年、月、日、时、分、秒、微秒等信息,你可以对这个对象进行计算(比如加一天、减一小时等)。- 字符串:这是一个人类可读的文本,
"2025-10-27 15:30:00",字符串不能直接用于日期计算。
我们经常需要在 datetime 对象和字符串之间进行转换:
strftime():将datetime对象格式化成字符串。- str format time -> 字符串 格式化 时间
strptime():将字符串解析成datetime对象。- str parse time -> 字符串 解析 时间
strftime():将 datetime 对象转为字符串
当你想把一个 datetime 对象显示给用户,或者以特定格式存储到文本文件或数据库时,就需要使用 strftime()。
语法
datetime_object.strftime(format_code)
关键:格式化代码
格式化代码是以百分号 开头的特殊字符,代表日期或时间的某个部分。
| 代码 | 含义 | 示例 |
|---|---|---|
%Y |
四位数的年份 | 2025 |
%y |
两位数的年份 | 23 |
%m |
两位数的月份 (01-12) | 10 |
%B |
月份的全称 | October |
%b |
月份的缩写 | Oct |
%d |
两位数的日 (01-31) | 27 |
%A |
星期几的全称 | Friday |
%a |
星期几的缩写 | Fri |
%H |
24小时制的小时 (00-23) | 15 |
%I |
12小时制的小时 (01-12) | 03 |
%M |
两位数的分钟 (00-59) | 30 |
%S |
两位数的秒 (00-59) | 05 |
%f |
微秒 (6位数字) | 123456 |
%p |
AM 或 PM | PM |
%j |
一年中的第几天 (001-366) | 300 |
%U |
一年中的第几周(周日为一周的开始)(00-53) | 43 |
%W |
一年中的第几周(周一为一周的开始)(00-53) | 43 |
%c |
本地化的日期和时间表示 | Fri Oct 27 15:30:00 2025 |
%x |
本地化的日期表示 | 10/27/23 |
%X |
本地化的时间表示 | 15:30:00 |
| 一个普通的百分号字符 |
示例
from datetime import datetime
# 1. 创建一个 datetime 对象
now = datetime.now()
print(f"原始的 datetime 对象: {now}")
# 输出: 原始的 datetime 对象: 2025-10-27 15:30:05.123456
# 2. 使用 strftime 格式化为不同格式的字符串
# 常见的 ISO 8601 格式
iso_format = now.strftime("%Y-%m-%d %H:%M:%S")
print(f"ISO 格式: {iso_format}")
# 输出: ISO 格式: 2025-10-27 15:30:05
# 更友好的可读格式
readable_format = now.strftime("%A, %B %d, %Y at %I:%M %p")
print(f"友好格式: {readable_format}")
# 输出: 友好格式: Friday, October 27, 2025 at 03:30 PM
# 只包含日期
date_only = now.strftime("%Y/%m/%d")
print(f"仅日期: {date_only}")
# 输出: 仅日期: 2025/10/27
# 只包含时间
time_only = now.strftime("%H:%M:%S")
print(f"仅时间: {time_only}")
# 输出: 仅时间: 15:30:05
# 带有微秒
with_microseconds = now.strftime("%Y-%m-%d %H:%M:%S.%f")
print(f"带微秒: {with_microseconds}")
# 输出: 带微秒: 2025-10-27 15:30:05.123456
strptime():将字符串转为 datetime 对象
当你从文件、用户输入或 API 接收到一个日期时间字符串,并需要对其进行计算或比较时,就需要使用 strptime() 将其转换回 datetime 对象。

语法
datetime.strptime(date_string, format_code)
date_string: 要解析的字符串。format_code: 描述date_string格式的代码,必须与字符串的格式完全匹配。
示例
from datetime import datetime
# 1. 定义一个日期时间字符串
date_string = "2025-10-27 15:30:00"
print(f"原始的字符串: '{date_string}'")
# 2. 使用 strptime 解析为 datetime 对象
# 格式代码必须与字符串格式一一对应
dt_object = datetime.strptime(date_string, "%Y-%m-%d %H:%M:%S")
print(f"解析后的 datetime 对象: {dt_object}")
print(f"对象的类型: {type(dt_object)}")
# 输出:
# 原始的字符串: '2025-10-27 15:30:00'
# 解析后的 datetime 对象: 2025-10-27 15:30:00
# 对象的类型: <class 'datetime.datetime'>
# 3. 另一个例子,使用不同的格式
date_string_2 = "27-Oct-23"
dt_object_2 = datetime.strptime(date_string_2, "%d-%b-%y")
print(f"\n解析 '{date_string_2}': {dt_object_2}")
# 输出:
# 解析 '27-Oct-23': 2025-10-27 00:00:00
# 4. 如果格式不匹配,会抛出 ValueError
try:
datetime.strptime("2025/10/27", "%Y-%m-%d") # 格式代码和字符串中的分隔符不匹配
except ValueError as e:
print(f"\n发生错误: {e}")
# 输出:
# 发生错误: time data '2025/10/27' does not match format '%Y-%m-%d'
常见场景与最佳实践
获取当前时间并格式化
这是最常见的用途。
from datetime import datetime
# 获取当前时间
now = datetime.now()
# 格式化为 "YYYY-MM-DD" 格式
date_str = now.strftime("%Y-%m-%d")
print(f"今天的日期是: {date_str}")
# 格式化为 "HH:MM:SS" 格式
time_str = now.strftime("%H:%M:%S")
print(f"现在的时间是: {time_str}")
解析用户输入的日期
假设用户输入了一个日期,你需要将其转换为 datetime 对象才能进行后续操作。
from datetime import datetime
user_input = "2025-01-01"
try:
# 尝试解析
new_year = datetime.strptime(user_input, "%Y-%m-%d")
print(f"成功解析: {new_year}")
# 现在可以进行计算了
from datetime import timedelta
day_after_new_year = new_year + timedelta(days=1)
print(f"元旦后一天是: {day_after_new_year.strftime('%Y-%m-%d')}")
except ValueError:
print(f"错误: 日期格式 '{user_input}' 无效,请使用 YYYY-MM-DD 格式。")
日志记录
在日志中,通常希望时间戳格式统一且精确。
from datetime import datetime
log_message = "用户登录成功"
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")
# 构造日志行
log_entry = f"[{timestamp}] INFO: {log_message}"
print(log_entry)
# 输出: [2025-10-27 15:30:05.123456] INFO: 用户登录成功
Python 3.11+ 的新特性:strftime 的 flags 参数
在 Python 3.11 及更高版本中,strftime 和 strptime 标准化了一些行为,并引入了 flags 参数(目前主要用于处理不同历法的转换,如 datetime.SH_FLAG_FOUR_DIGIT_YEAR),但对于绝大多数日常使用,上述方法仍然是标准且最常用的。

| 方法 | 全称 | 功能 | 输入 | 输出 |
|---|---|---|---|---|
strftime() |
str format time | 格式化 | datetime 对象 |
字符串 |
strptime() |
str parse time | 解析 | 字符串 | datetime 对象 |
记住这两个方法的名字和功能,以及常用的格式化代码(%Y, %m, %d, %H, %M, %S),你就能应对绝大多数 Python 日期时间格式化的需求了。
