编程与 AI13 分钟阅读更新于 2026-07-15

Python 日期和时间怎么处理:datetime、timedelta、格式化和解析

讲清 Python datetime 模块在实际工作中的用法:日期解析、格式化、时间差计算、时间戳转换和常见时区问题。

相关工具

先分清日期、时间和时间戳

Python 处理时间最常用的是 datetime 模块。date 表示日期,time 表示一天中的时间,datetime 同时包含日期和时间,timedelta 表示时间差。时间戳则是一个数字,表示从 1970-01-01 00:00:00 UTC 到某个时刻的秒数或毫秒数。

实际开发里,经常会在三种形态之间转换:接口返回时间戳,页面要展示成日期字符串;用户输入日期字符串,程序要转成 datetime;统计报表要计算两个日期之间相差几天。先分清当前数据是什么形态,再决定用哪个方法。

获取当前时间:

python代码示例
from datetime import datetime

now = datetime.now()
print(now)
print(now.strftime("%Y-%m-%d %H:%M:%S"))

字符串和 datetime 互转

把 datetime 转成字符串用 strftime,把字符串转成 datetime 用 strptime。两个方法名字很像,但方向相反。最容易错的是格式不匹配,比如字符串是 2026/07/15,你却用 %Y-%m-%d 解析,就会报错。

示例:

python代码示例
from datetime import datetime

text = "2026-07-15 09:30:00"
dt = datetime.strptime(text, "%Y-%m-%d %H:%M:%S")

print(dt.year, dt.month, dt.day)
print(dt.strftime("%Y/%m/%d"))

常见格式里,%Y 是四位年份,%m 是月份,%d 是日期,%H 是 24 小时制小时,%M 是分钟,%S 是秒。注意 M 是分钟,不是月份。

用 timedelta 做日期加减

计算昨天、7 天后、两个日期相差多少天,都可以用 timedelta。它比自己手动处理月份天数靠谱,因为不同月份天数不同,还有闰年问题。

示例:

python代码示例
from datetime import datetime, timedelta

today = datetime.now()
yesterday = today - timedelta(days=1)
next_week = today + timedelta(days=7)

print(yesterday.strftime("%Y-%m-%d"))
print(next_week.strftime("%Y-%m-%d"))

如果是工作日、节假日、账期这类业务日期,就不能只靠 timedelta。自然日和工作日不是一回事。简单自然日计算可以用 Python,复杂工作日计算可以配合站内日期计算工具先确认规则。

时间戳和时区别混在一起

datetime.fromtimestamp 默认按本地时区转换秒级时间戳。如果你拿到的是 13 位毫秒时间戳,要先除以 1000。接口联调时,时间差 8 小时通常是 UTC 和北京时间展示差异,不一定是数据错。

示例:

python代码示例
from datetime import datetime, timezone, timedelta

ts_ms = 1720953600000
beijing = timezone(timedelta(hours=8))

dt = datetime.fromtimestamp(ts_ms / 1000, tz=beijing)
print(dt.strftime("%Y-%m-%d %H:%M:%S %z"))

如果项目涉及多时区,建议存储统一用时间戳或 UTC,展示时再按用户时区转换。不要在数据库里混着存北京时间字符串和 UTC 字符串,后面排查会很难。

常见问题

strftime 和 strptime 怎么区分?

strftime 是 datetime 转字符串,strptime 是字符串转 datetime。

13 位时间戳怎么转?

通常先除以 1000,再用 fromtimestamp 转换。

时间差 8 小时一定是错吗?

不一定,可能是 UTC 和北京时间展示差异。要看存储和展示规则。

Python 实用

继续阅读

返回专题