在编程中,日期与时间是最常用的基础数据类型之一。
无论是生成日志、命名文件、输出统计报表,还是进行时间计算,都离不开对日期时间对象(datetime)的格式化处理。
Python 提供了两种主流的格式化方式:
strftime() 方法(经典、通用)
f-string 格式说明语法(现代、直观)
二者共用同一套格式代码(format codes),统称为“日期时间格式说明”(DateTime Format Codes)。
一、创建 datetime 对象
在格式化之前,需先创建一个 datetime 对象:
from datetime import datetime
# 当前系统时间
now = datetime.now()
print(now)
# 示例输出:2025-10-18 14:30:45.123456
# 自定义时间(年, 月, 日, 时, 分, 秒)
fixed = datetime(2025, 10, 18, 14, 30, 45)二、使用 strftime() 进行格式化
strftime() 是最经典的日期时间格式化方法。它将 datetime 对象转换为指定格式的字符串。
from datetime import datetime
now = datetime(2025, 10, 18, 14, 30, 45)
# 基本格式化
print(now.strftime("%Y-%m-%d %H:%M:%S"))
# 输出:2025-10-18 14:30:45
# 带星期、月份名称的英文格式
print(now.strftime("%A, %B %d, %Y"))
# 输出:Saturday, October 18, 2025strftime:string format time
格式代码均以 % 开头,用于指定输出结构。
三、使用 f-string
Python 3.6+ 的 f-string 支持直接对 datetime 进行格式化。
语法如下:
f"{datetime对象:%格式说明符}"示例:
from datetime import datetime
now = datetime(2025, 10, 18, 14, 30, 45)
print(f"{now:%Y-%m-%d %H:%M:%S}") # 2025-10-18 14:30:45
print(f"{now:%Y-%m-%dT%H:%M:%S}") # 2025-10-18T14:30:45 (ISO格式)与 strftime() 相比,f-string 更加简洁、直观,也可与其他表达式混用:
user = "Alice"
print(f"User {user} logged in at {now:%H:%M:%S}.")
# User Alice logged in at 14:30:45四、常用日期时间格式代码
代码
示例
含义
%Y
2025
四位年份
%y
25
两位年份
%m
10
月份(01–12)
%B
October
英文月份全名
%b
Oct
英文月份缩写
18
日期(01–31)
%A
Saturday
星期全名
%a
Sat
星期缩写
%H
14
小时(24小时制)
02
小时(12小时制)
%M
30
分钟(00–59)
%S
45
秒(00–59)
%p
PM
上午/下午标识(中文系统可能为空或为“上午/下午”)
%f
微秒(6位)
%j
291
一年中的第几天(001–366)
%U
42
周数(以周日为首日)
%W
41
周数(以周一为首日)
%G
2025
ISO 年份
%V
42
ISO 周序号
%u
6
ISO 星期几(1=周一)
10/18/25
本地日期表示法(随地区变化)
%X
14:30:45
本地时间表示法(随地区变化)
%c
Sat Oct 18 14:30:45 2025
本地完整日期时间表示法
提示:
(1)%x、%X、%c 会根据系统区域自动本地化显示,在中文系统上可能输出如 “2025/10/18 14:30:45 星期六”。
(2)%U(周日为首日)与 %W(周一为首日)计算规则不同,因此同一天的周数可能相差 1。
综合示例:多种输出风格
from datetime import datetime
now = datetime(2025, 10, 18, 14, 30, 45)
# 1)标准格式
print(f"{now:%Y-%m-%d %H:%M:%S}") # 2025-10-18 14:30:45
# 2)ISO 8601 格式(国际标准)
print(f"{now:%Y-%m-%dT%H:%M:%S}") # 2025-10-18T14:30:45
# 3)紧凑文件名格式
print(f"{now:%Y%m%d_%H%M%S}") # 20251018_143045
# 4)英文完整格式
print(f"{now:%A, %B %d, %Y %H:%M:%S}") # Saturday, October 18, 2025 14:30:45
# 5)仅日期与仅时间
print(f"{now:%Y-%m-%d}") # 2025-10-18
print(f"{now:%H:%M:%S}") # 14:30:45
# 6)中文自定义格式
print(f"{now:%Y年%m月%d日 %H时%M分%S秒}") # 2025年10月18日 14时30分45秒
# 7)周数与年内天数
print(f"第{now:%U}周, 年内第{now:%j}天") # 第42周, 年内第291天
# 8)ISO 周日期
print(f"{now:%G-W%V-%u}") # 2025-W42-6五、动态格式控制
格式模板可由变量控制,使输出更灵活:
from datetime import datetime
now = datetime(2025, 10, 18, 14, 30, 45)
fmt = "%Y/%m/%d %H:%M:%S"
# 使用 f-string 动态嵌入格式字符串
print(f"{now:{fmt}}") # 2025/10/18 14:30:45或封装为函数:
def format_datetime(dt, fmt="%Y-%m-%d %H:%M:%S"):
"""根据传入格式动态生成日期字符串"""
return f"{dt:{fmt}}"
print(format_datetime(now, "%B %d, %Y")) # October 18, 2025
print(format_datetime(now, "%Y年%m月%d日 %A")) # 2025年10月18日 Saturday提示:
这种动态控制方式结合 f-string 的表达式特性,可与配置文件、语言环境自动切换等功能无缝结合,特别适合国际化(i18n)与日志系统开发。
六、解析字符串为 datetime(strptime)
与 strftime() 相对,strptime() 用于将字符串解析为 datetime 对象。
名称来源于 string parse time,语法与格式说明符完全相同。
from datetime import datetime
# 示例字符串
s1 = "2025-10-18 14:30:45"
s2 = "October 18, 2025 14:30:45"
# 按指定格式解析为 datetime 对象
dt1 = datetime.strptime(s1, "%Y-%m-%d %H:%M:%S")
dt2 = datetime.strptime(s2, "%B %d, %Y %H:%M:%S")
print(dt1)
print(dt2)输出结果:
2025-10-18 14:30:45
2025-10-18 14:30:45strptime() 的格式代码与 strftime() 完全相同,学习一套即可双向使用。
若格式不匹配,将抛出 ValueError:
datetime.strptime("2025/10/18", "%Y-%m-%d") # ❌ 格式不符应用示例:
# 从日志文本中提取时间戳
log = "User login at 2025-10-18 14:30:45"
timestamp = datetime.strptime(log[-19:], "%Y-%m-%d %H:%M:%S")
print(timestamp)
# 输出:2025-10-18 14:30:45提示:
strptime() 常用于解析文件名、日志记录或用户输入中的时间信息。
结合 strftime(),可实现“字符串 → datetime → 字符串”的双向转换。
七、常见错误与注意事项
1、错误使用字符串格式符号
print(f"{now:YYYY-MM-DD}") # ❌ 无效写法2、不要在非 datetime 对象上使用 %Y 等代码
print(f"{123:%Y-%m-%d}") # ❌ TypeError3、本地化格式依赖系统区域设置
%x、%c、%X 等结果会随系统语言不同而变化。
4、精度与时区问题
datetime.now() 返回本地时间;若需协调世界时(UTC),请使用 datetime.utcnow()。
小结
Python 的日期与时间格式化建立在统一的格式说明系统上,无论使用 strftime() 还是 f-string,都可通过 % 代码灵活控制输出。
核心要点:
%Y-%m-%d %H:%M:%S —— 最常用格式
f"{dt:%Y-%m-%dT%H:%M:%S}" —— ISO 8601
支持国际化与本地化输出
strptime() —— 反向解析字符串为 datetime 对象
可结合变量实现动态格式控制
掌握这些规则,你就能在任何场景下优雅地呈现时间信息——从日志文件到 UI 输出,从人类可读日期到机器标准格式。
“点赞有美意,赞赏是鼓励”
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.