Python 日期和时间怎么处理:datetime、timedelta、格式化和解析
讲清 Python datetime 模块在实际工作中的用法:日期解析、格式化、时间差计算、时间戳转换和常见时区问题。
相关工具
先分清日期、时间和时间戳
Python 处理时间最常用的是 datetime 模块。date 表示日期,time 表示一天中的时间,datetime 同时包含日期和时间,timedelta 表示时间差。时间戳则是一个数字,表示从 1970-01-01 00:00:00 UTC 到某个时刻的秒数或毫秒数。
实际开发里,经常会在三种形态之间转换:接口返回时间戳,页面要展示成日期字符串;用户输入日期字符串,程序要转成 datetime;统计报表要计算两个日期之间相差几天。先分清当前数据是什么形态,再决定用哪个方法。
获取当前时间:
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 解析,就会报错。
示例:
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。它比自己手动处理月份天数靠谱,因为不同月份天数不同,还有闰年问题。
示例:
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 和北京时间展示差异,不一定是数据错。
示例:
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 和北京时间展示差异。要看存储和展示规则。