网易首页 > 网易号 > 正文 申请入驻

Python:日期与时间格式化详解

0
分享至

在编程中,日期与时间是最常用的基础数据类型之一。

无论是生成日志、命名文件、输出统计报表,还是进行时间计算,都离不开对日期时间对象(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, 2025

strftime: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:45

strptime() 的格式代码与 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}")  # ❌ TypeError

3、本地化格式依赖系统区域设置

%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.

相关推荐
热点推荐
人口不到16万的库拉索首进世界杯!

人口不到16万的库拉索首进世界杯!

扬子晚报
2025-11-19 17:47:44
为保障U23国足参加2026亚运会,中超、中甲将于9月6日后休赛

为保障U23国足参加2026亚运会,中超、中甲将于9月6日后休赛

懂球帝
2025-11-20 11:51:09
1990年,德国为了统一被迫放弃19万平方千米的土地,并写进宪法

1990年,德国为了统一被迫放弃19万平方千米的土地,并写进宪法

博览历史
2025-11-16 18:45:03
奥斯卡都快黄了,阿汤哥才拿到小金人

奥斯卡都快黄了,阿汤哥才拿到小金人

南风窗
2025-11-19 14:54:40
日本自卫队用电影片段打舆论战,解放军用多语种海报回击:现代军事博弈已进入认知域对抗时代

日本自卫队用电影片段打舆论战,解放军用多语种海报回击:现代军事博弈已进入认知域对抗时代

Hi秒懂科普
2025-11-19 14:41:07
记者:蒯纪闻左臂疑似骨裂,刘浩帆膝盖内侧副韧带出现伤病

记者:蒯纪闻左臂疑似骨裂,刘浩帆膝盖内侧副韧带出现伤病

懂球帝
2025-11-20 09:39:05
我们已经没有退路了,如果中国再次衰落,欧美绝不会再给崛起机会

我们已经没有退路了,如果中国再次衰落,欧美绝不会再给崛起机会

扶苏聊历史
2025-11-14 15:33:48
贪污上亿、假慈善?被实名举报的韩红,如今连坐椅子都成了“错”

贪污上亿、假慈善?被实名举报的韩红,如今连坐椅子都成了“错”

翰飞观事
2025-09-25 21:18:29
意大利餐厅辱华后续:市长亲自出面训斥,店铺关门,或将巨额赔偿

意大利餐厅辱华后续:市长亲自出面训斥,店铺关门,或将巨额赔偿

趣文说娱
2025-11-19 15:09:06
男子结婚找老同学订8箱五粮液,没喝完按原价退6箱,老同学:不退

男子结婚找老同学订8箱五粮液,没喝完按原价退6箱,老同学:不退

一月爱八月
2025-11-11 20:02:56
难怪解放军连续出重拳,日方极力隐藏的武器,被中方发现了

难怪解放军连续出重拳,日方极力隐藏的武器,被中方发现了

林子说事
2025-11-19 13:12:28
江苏预警!影响7市!

江苏预警!影响7市!

江南晚报
2025-11-20 03:54:12
1982 年高材生王佐良娶瘫痪的张海迪,40 年后,才知他是人间清醒

1982 年高材生王佐良娶瘫痪的张海迪,40 年后,才知他是人间清醒

墨印斋
2025-11-15 16:42:56
捅完琉球窝!中国再掀北海道老底,日本80年前埋的雷,炸了

捅完琉球窝!中国再掀北海道老底,日本80年前埋的雷,炸了

南宫一二
2025-11-17 07:17:39
轰6成群出动,信号非同一般,解放军这次,要同时收拾三个国家

轰6成群出动,信号非同一般,解放军这次,要同时收拾三个国家

乐天闲聊
2025-11-18 13:55:48
为什么越来越多机关事业单位的临时工工资发不出了?

为什么越来越多机关事业单位的临时工工资发不出了?

细说职场
2025-11-19 23:26:19
仅剩2000多万人?比乌克兰投降更可怕的事情是,再打可能亡国了

仅剩2000多万人?比乌克兰投降更可怕的事情是,再打可能亡国了

历史求知所
2025-11-11 07:05:03
青龙奖红毯韩星集体翻车!孙艺珍面相变了,玄彬气色差发际线堪忧

青龙奖红毯韩星集体翻车!孙艺珍面相变了,玄彬气色差发际线堪忧

萌神木木
2025-11-19 19:59:26
和原配斗了5年拿5亿分手费退场,向太:她是我见过最强悍的小三

和原配斗了5年拿5亿分手费退场,向太:她是我见过最强悍的小三

上官晚安
2025-11-20 01:39:51
今早突发!刚刚,深圳地铁道歉

今早突发!刚刚,深圳地铁道歉

南方都市报
2025-11-20 10:20:14
2025-11-20 16:47:00
MediaTea
MediaTea
专业的数字媒体、新媒体技术
1600文章数 71关注度
往期回顾 全部

科技要闻

英伟达单季狂揽570亿美元,手握5000亿订单

头条要闻

户外博主发现南太行失联43天男子遗体:先发现黑色鞋子

头条要闻

户外博主发现南太行失联43天男子遗体:先发现黑色鞋子

体育要闻

Faker,何以成为Faker

娱乐要闻

胡彦斌易梦玲恋情曝光,相差16岁

财经要闻

霸王茶姬创始人将与“光伏女神”结婚

汽车要闻

一汽丰田发布IT'S TiME 3.0 三款焕新产品同步亮相

态度原创

游戏
时尚
教育
本地
数码

Steam游戏100%好评被打破 差评竟与游戏无关

这四组绝美的冬季配色,很“暖”!

教育要闻

AI都能手搓APP了,少儿编程课还有必要报吗?

本地新闻

卖力整活儿的大湾鸡,靠疯癫成了新顶流

数码要闻

真我全新开放式耳机Buds Clip正式发布 延迟低至45ms

无障碍浏览 进入关怀版