Python Academy · 课时

使用 zoneinfo 处理时区

处理带时区信息的 datetime

第 4 / 4 课13 个步骤

使用 zoneinfo 处理时区 是 CoddyKit 上的免费 Python Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Python Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Python Academy 课程共包含 4 节课。

无时区与有时区的日期时间

一个无时区的日期时间没有时区信息——它只表示“下午 2 点”,却无法说明是哪一个时区的下午 2 点。一个有时区的日期时间携带时区信息,因此可以确定全球范围内的确切时刻。

当用户分布在多个地区时,有时区的日期时间可以避免错误。

from datetime import datetime
naive = datetime(2026, 5, 30, 14, 0)
print(naive.tzinfo)

导入时区信息模块

Python 3.9 及更高版本在标准库中提供了 zoneinfo。请导入 ZoneInfo,并传入类似 'Europe/Istanbul' 或 'America/New_York' 这样的 IANA 时区名称。

from zoneinfo import ZoneInfo
tz = ZoneInfo('Europe/Istanbul')
print(tz)

创建有时区的日期时间

构造日期时间时传入 tzinfo=ZoneInfo(...),即可使其成为有时区的日期时间。这样,它就能确切知道自己属于哪个地区。

from datetime import datetime
from zoneinfo import ZoneInfo
d = datetime(2026, 5, 30, 14, 0, tzinfo=ZoneInfo('Europe/Istanbul'))
print(d)
print(d.tzinfo)

以 UTC 作为锚点

UTC 是通用参考标准。使用 datetime.now(ZoneInfo('UTC')) 获取当前的 UTC 有时区时间。将时间以 UTC 存储是最佳实践。

from datetime import datetime
from zoneinfo import ZoneInfo
utc_now = datetime(2026, 5, 30, 11, 0, tzinfo=ZoneInfo('UTC'))
print(utc_now)

在时区之间转换

.astimezone(tz) 会将有时区的日期时间转换为另一个时区,同时调整时钟,使其仍表示同一时刻。

from datetime import datetime
from zoneinfo import ZoneInfo
utc = datetime(2026, 5, 30, 11, 0, tzinfo=ZoneInfo('UTC'))
ist = utc.astimezone(ZoneInfo('Europe/Istanbul'))
print('UTC:', utc)
print('Istanbul:', ist)

同一时刻,不同的时钟

转换后,时钟显示的数字会不同,但底层时刻完全相同。比较两个有时区的日期时间时,比较的是实际时刻,而不是显示的数字。

from datetime import datetime
from zoneinfo import ZoneInfo
utc = datetime(2026, 5, 30, 11, 0, tzinfo=ZoneInfo('UTC'))
ny = utc.astimezone(ZoneInfo('America/New_York'))
print(utc == ny)

读取 UTC 偏移量

.utcoffset() 方法会返回一个 timedelta,表示该时刻的时区距离 UTC 有多远,其中包括任何夏令时调整。

from datetime import datetime
from zoneinfo import ZoneInfo
d = datetime(2026, 5, 30, 14, 0, tzinfo=ZoneInfo('Europe/Istanbul'))
print('Offset:', d.utcoffset())

自动处理夏令时

zoneinfo 使用系统时区数据库,因此知道夏令时何时开始和结束。同一个时区在一年中的不同时间可能具有不同的偏移量。

from datetime import datetime
from zoneinfo import ZoneInfo
winter = datetime(2026, 1, 15, 12, 0, tzinfo=ZoneInfo('America/New_York'))
summer = datetime(2026, 7, 15, 12, 0, tzinfo=ZoneInfo('America/New_York'))
print('Winter:', winter.utcoffset())
print('Summer:', summer.utcoffset())

为无时区时间添加时区

如果一个无时区的日期时间表示已知的本地时间,请使用 .replace(tzinfo=...) 为它添加时区。这样只会为它标记时区,不会改变时钟时间。

from datetime import datetime
from zoneinfo import ZoneInfo
naive = datetime(2026, 5, 30, 9, 0)
aware = naive.replace(tzinfo=ZoneInfo('Europe/Istanbul'))
print(aware)

避免混用无时区和有时区的日期时间

您不能将无时区的日期时间与有时区的日期时间相减或比较——Python 会引发 TypeError。请在整个程序中保持日期时间的一致性。

from datetime import datetime
from zoneinfo import ZoneInfo
naive = datetime(2026, 5, 30, 9, 0)
aware = datetime(2026, 5, 30, 9, 0, tzinfo=ZoneInfo('UTC'))
try:
    print(aware - naive)
except TypeError as e:
    print('Error:', e)

使用时区进行格式化

格式化有时区的日期时间时,%Z 代码会输出时区名称,%z 会输出数字偏移量。

from datetime import datetime
from zoneinfo import ZoneInfo
d = datetime(2026, 5, 30, 14, 0, tzinfo=ZoneInfo('Europe/Istanbul'))
print(d.strftime('%Y-%m-%d %H:%M %Z %z'))

快速检查

无时区的日期时间与有时区的日期时间之间的关键区别是什么?

回顾:使用 zoneinfo 处理时区

总结:

  • 无时区的日期时间没有时区信息;有时区的日期时间携带 tzinfo。
  • 使用 zoneinfo 模块中的 ZoneInfo('Region/City')。
  • .astimezone() 会将有时区的日期时间转换到另一个时区。
  • zoneinfo 会自动处理夏令时;您绝不能将无时区和有时区的日期时间混用。
from datetime import datetime
from zoneinfo import ZoneInfo
utc = datetime(2026, 5, 30, 12, 0, tzinfo=ZoneInfo('UTC'))
print(utc.astimezone(ZoneInfo('Europe/Istanbul')))
免费开始

用 AI 导师学习 Python — 免费

在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。

课程
76
课程
320

常见问题解答

「使用 zoneinfo 处理时区」课时是免费的吗?

是的 — 「使用 zoneinfo 处理时区」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Python Academy 课程的其余内容,请升级到 CoddyKit PRO。 Python Academy 课程共包含 4 节课。

「使用 zoneinfo 处理时区」这节课中我会学到什么?

处理带时区信息的 datetime 你通过在浏览器中直接运行的动手代码来练习 Python Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Python Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Python Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。

「使用 zoneinfo 处理时区」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Python Academy 课中编写并运行代码吗?

能。每节 Python Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. date、time、datetime
  2. Timedelta 与算术运算
  3. 格式化与解析
  4. 使用 zoneinfo 处理时区
← 返回 Python Academy