🕒 Python datetime 超全指南:时间管理大师养成手册

“时间是程序员的敌人。” ——每一个调过时区 Bug 的人

今天我们来彻底征服 Python 的时间系统。本文涵盖 datetime全部核心用法,从基础创建到时区处理,从格式化到时间戳,从计算到坑点,全都讲清楚。

准备好了吗?系好安全带,我们要穿越时空了。

一、时间世界的四大金刚

Python 的时间体系主要来自:

import datetime

这个模块里有几个核心类:

作用
date只管年月日
time只管时分秒
datetime年月日时分秒全管
timedelta时间差

此外还有:

作用
tzinfo时区抽象基类
timezone固定偏移时区
zoneinfo(3.9+)真实时区支持

二、创建时间对象

1️⃣ 创建 date

from datetime import date

d = date(2026, 2, 27)
print(d)

输出:

2026-02-27

常用属性:

d.year
d.month
d.day

2️⃣ 创建 time

from datetime import time

t = time(20, 30, 15)
print(t)

支持微秒:

time(20, 30, 15, 123456)

3️⃣ 创建 datetime

from datetime import datetime

dt = datetime(2026, 2, 27, 20, 30, 15)

三、获取当前时间

datetime.now()      # 当前本地时间
datetime.utcnow()   # 当前UTC时间(不推荐)
Warning

utcnow() 不带时区信息,是“假 UTC”。

推荐写法:

from datetime import datetime, timezone

datetime.now(timezone.utc)

四、时间戳(timestamp)

获取时间戳

dt.timestamp()

返回自 1970-01-01 起的秒数。

时间戳转 datetime

datetime.fromtimestamp(1709030000)

UTC 版本:

datetime.utcfromtimestamp(ts)  # 不推荐

推荐:

datetime.fromtimestamp(ts, timezone.utc)

五、时间计算(timedelta)

创建时间差

from datetime import timedelta

delta = timedelta(days=1, hours=2, minutes=30)

支持:

  • days
  • seconds
  • microseconds
  • milliseconds
  • minutes
  • hours
  • weeks

时间加减

new_dt = dt + timedelta(days=1)

两个时间相减:

delta = dt1 - dt2

六、格式化与解析(重点)

1️⃣ 格式化:strftime

dt.strftime("%Y-%m-%d %H:%M:%S")

常用格式符:

符号含义
%Y四位年份
%m
%d
%H小时(24)
%M分钟
%S
%f微秒
%z时区

2️⃣ 解析:strptime

datetime.strptime("2026-02-27 20:30:15", "%Y-%m-%d %H:%M:%S")

⚠ 格式必须完全匹配,否则报错。

七、时区处理(高级)

1️⃣ 固定时区

from datetime import timezone, timedelta

tz = timezone(timedelta(hours=8))
dt = datetime.now(tz)

2️⃣ 推荐方案:zoneinfo(3.9+)

from zoneinfo import ZoneInfo
from datetime import datetime

dt = datetime.now(ZoneInfo("Asia/Taipei"))

其他例子:

  • "Asia/Shanghai"
  • "UTC"
  • "America/New_York"

时区转换

dt_utc = dt.astimezone(ZoneInfo("UTC"))

八、naive vs aware(大坑)

类型是否带时区
naive
aware

判断:

dt.tzinfo is None

⚠ 千万不要混着算:

naive - aware   # 会报错

九、替换时间字段

dt.replace(year=2030)

⚠ 不会自动进位

十、常用实战技巧

获取今天

date.today()

获取本月第一天

today = date.today()
first_day = today.replace(day=1)

获取昨天

date.today() - timedelta(days=1)

判断是否同一天

dt1.date() == dt2.date()

十一、排序与比较

datetime 支持比较:

dt1 > dt2

可以直接排序:

sorted(datetime_list)

十二、ISO 格式

生成:

dt.isoformat()

解析:

datetime.fromisoformat("2026-02-27T20:30:15")

十三、性能与最佳实践

推荐导入方式

✅ 推荐:

from datetime import datetime

❌ 不推荐:

import datetime
datetime.datetime(...)

生产环境建议

  • 永远存 UTC
  • 展示时转本地
  • 不使用 utcnow()
  • 使用 zoneinfo
  • 不混用 naive/aware

十四、常见坑位清单

解释
2月30日会直接报错
月份从0开始?❌ Python 月份从1开始
时间自动进位?❌ replace 不进位
夏令时会影响时间差
timestamp 精度浮点数存在误差

十五、终极总结

你需要记住的核心

  • datetime 是主力
  • timedelta 用于计算
  • strftime/strptime 用于转换
  • zoneinfo 处理时区
  • 永远优先使用 aware datetime
声明:本站所有文章,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。-- mikigo