惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

MyScale Blog
MyScale Blog
博客园 - 叶小钗
小众软件
小众软件
宝玉的分享
宝玉的分享
Apple Machine Learning Research
Apple Machine Learning Research
Jina AI
Jina AI
Last Week in AI
Last Week in AI
量子位
腾讯CDC
罗磊的独立博客
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - Franky
博客园 - 【当耐特】
Hugging Face - Blog
Hugging Face - Blog
有赞技术团队
有赞技术团队
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
V
Visual Studio Blog
爱范儿
爱范儿
月光博客
月光博客
博客园 - 三生石上(FineUI控件)
雷峰网
雷峰网
V
V2EX
WordPress大学
WordPress大学
Google DeepMind News
Google DeepMind News
阮一峰的网络日志
阮一峰的网络日志
K
Kaspersky official blog
Vercel News
Vercel News
L
LINUX DO - 热门话题
The Hacker News
The Hacker News
The Register - Security
The Register - Security
IT之家
IT之家
C
Cybersecurity and Infrastructure Security Agency CISA
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
人人都是产品经理
人人都是产品经理
Martin Fowler
Martin Fowler
S
SegmentFault 最新的问题
N
News | PayPal Newsroom
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Attack and Defense Labs
Attack and Defense Labs
S
Securelist
T
The Blog of Author Tim Ferriss
GbyAI
GbyAI
Microsoft Security Blog
Microsoft Security Blog
H
Hacker News: Front Page
博客园 - 聂微东
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Project Zero
Project Zero
I
InfoQ
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
PCI Perspectives
PCI Perspectives

博客园 - 曦远Code

给热水器装上“电量显示”:用 Shelly Gen4 脚本实现零改装水量预测 StarBlog番外(5) 从1.6到1.10,基于Avalonia AOT 开发的 Publisher 半年进化之路 你的显卡能跑多少算子?用 55 个检查项,给 PyTorch GPU 环境做一次冒烟测试 ROCm on Windows 性能排查:RX 6650 XT 跑 PyTorch,为什么加速不明显? lighthouse-fw:一个管理腾讯云轻量服务器防火墙的终端工具 用本地大模型驱动中文输入法,我做了一个实验性的项目 Spark.NET:一个试图把 Django / Rails 式开发体验带回 .NET 世界的全栈 Web 框架。 Zed AI 白嫖免费模型,搭配 DeepSeek v4,玩转 Agent 编程技巧 当 CGO 遇见 Zig:一种更优雅的折腾方式,对比 GCC 后端 2026年AI编程工具横评:Cursor、Codex、Claude Code、Zed、Windsurf 后 Django 时代:SQLAlchemy 2.0、Tortoise 与 Piccolo 三大异步 ORM 选型指南 Python网络请求库,从 requests 到 httpx 浅谈次世代代码编辑器 Zed:Rust 原生性能、GPU 渲染 你的SSH密钥可能已经过期了 是谁 2026 年还在用 Sublime Text 写代码? 什么年代了怎么还在用bash啊?现代化shell开箱体验: fish, nu, elvish 别再手动复制SSH公钥了,Linux服务器一键从GitHub快速导入公钥 2026年的Linux桌面环境选择,哪些适合Debian服务器? 在 Windows 11 上使用 Hyper-V 虚拟机准备安装OpenClaw C# 扩展方法只会写 this 吗?C# 14 新语法直接把扩展方法玩出了花 经历分享,发现挖矿木马后,服务器快速备份与重装(腾讯云平台) Coolify: Vercel 的开源版私有化部署平替版 分享一些2026年有意思的现代化Django生态组件 实测 Django 6.0:模版片段、后台任务、CSP 安全,三大特性体验报告 当人人都能用 AI 写代码时,我为什么选择重回 Django? 打包ROCm环境的相关Wheel方便后续使用 从挖矿木马入侵到 Docker Rootless 加固,我的服务器安全复盘 AMD显卡也能畅玩AI画图!ROCm+ComfyUI部署全指南
现代 Python 程序优雅处理日期时间的避坑指南
曦远Code · 2026-03-31 · via 博客园 - 曦远Code

前言

很多 Python 新手(甚至老手)都踩过这几个坑:

  • 模块太多:你需要同时和 datetimetimecalendar 三个模块打交道。想获取时间戳?去 time。想做日期加减?回 datetime
  • Naive vs Aware(时区陷阱): 这是最坑的地方。Python 默认生成的 datetime 对象是不带时区信息的(Naive)。如果把一个带时区的对象和一个不带时区的对象进行比较或相加,程序会直接抛出 TypeError 崩溃。
  • API 的破碎感: 为了做一个“减去 3 天”的操作,需要导入 timedelta,写 datetime.now() - timedelta(days=3);为了解析ISO字符串,得写很长的 strptime 格式化字符串。
  • 不支持“人类语言”:没法直接处理“昨天”、“两周后”这种逻辑,必须手动计算 timedelta

相比之下,Go 语言虽然要背 2006-01-02 15:04:05 这个神奇的时间点,但至少逻辑是自洽的。而 Python 的原生体验更像是不断缝补丁。

新工具推荐

时间来到 2026 年,社区生态和 python 标准库都在进化,来看看这些现代化的时间处理方式。

库名 角色 推荐理由
ZoneInfo 标准库 Python 3.9+ 内置,彻底取代 pytz,处理 IANA 时区。
Pendulum 核心逻辑 Datetime 的子类,语法极其优雅,处理“几天后”、“下周一”信手拈来。
Arrow 采集器 爬虫必备。它对凌乱字符串的兼容性极强,.get() 一下就搞定。

在 Python 3.9 之前,pytz 是时区处理的唯一选择,但它的 API 设计极其反人类(比如著名的 localize 陷阱)。

2026 年的今天,ZoneInfo 配合 IANA 时区数据库已经非常成熟。如果你在 Windows 上运行,记得装一下 tzdata 这个包;在 Linux 上,它直接读取系统数据库。这才是真正的 Pythonic

如何选择?

  • 追求“零依赖”且只需要处理时区转换:ZoneInfo (标准库)。
  • 需要处理复杂的日期加减(比如“下个月的第三个周五”):Pendulum
  • 正在写爬虫,面对的是各种奇怪的字符串时间:Arrow
  • 在用 Django: 坚持用 Django 内置的 timezone 工具类(它底层已经全面拥抱 ZoneInfo 了)。

代码例子

处理复杂的时区转换与加减(使用 Pendulum)

import pendulum

# 1. 语义化创建
now = pendulum.now('Asia/Shanghai')
future = now.add(months=2).end_of('week')

# 2. 极简的“人类化”显示
print(future.diff_for_humans()) # "2 months from now"

# 3. 彻底解决时区比对崩溃
dt_utc = pendulum.now('UTC')
if now > dt_utc: # Pendulum 会自动处理比对逻辑
    print("安全比对,不再报错")

从 API 或爬虫中解析凌乱时间(使用 Arrow)

import arrow

# 不管是时间戳、ISO 8601 还是特定格式,统统 get
raw_date = "2026-03-24T10:13:35+08:00"
t = arrow.get(raw_date)

# 转换成北京时间并格式化
print(t.to('Asia/Shanghai').format('YYYY-MM-DD HH:mm:60'))

标准库提供的时区转换(ZoneInfo)

如果在写一个轻量级脚本,不想添加额外依赖,可以直接用标准库的 ZoneInfo

from datetime import datetime
from zoneinfo import ZoneInfo

# 1. 创建一个带时区的 UTC 时间(2026 年的标配起点)
utc_now = datetime.now(ZoneInfo("UTC"))
print(f"UTC 时间: {utc_now}")

# 2. 一行代码转成本地时间(比如北京时间)
# 再也不需要 pytz.timezone('...').localize(...) 这种阴间操作了
beijing_time = utc_now.astimezone(ZoneInfo("Asia/Shanghai"))
print(f"北京时间: {beijing_time}")

# 3. 甚至可以处理极其冷门的时区,比如你想看看纽约的开发者在干嘛
ny_time = beijing_time.astimezone(ZoneInfo("America/New_York"))
print(f"纽约时间: {ny_time}")

# 4. 获取简写的时区名称(如 CST, EST)
print(f"当前时区缩写: {ny_time.tzname()}")

小结

永远不要使用 datetime.now() 养成使用 datetime.now(ZoneInfo("UTC"))pendulum.now() 的习惯。

数据库存储统一 UTC: 无论用户在哪里,数据库里存的一定要是 UTC。

前端交付 ISO 8601: 别传时间戳,传 2026-03-25T11:30:00Z 这种标准字符串,前端解析起来最省心。

微信公众号:「程序设计实验室」 专注于互联网热门新技术探索与团队敏捷开发实践,包括架构设计、机器学习与数据分析算法、移动端开发、Linux、Web前后端开发等,欢迎一起探讨技术,分享学习实践经验。