news 2026/5/10 21:05:11

09-扩展知识——09. tzinfo 与 timezone

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
09-扩展知识——09. tzinfo 与 timezone

09. tzinfo 与 timezone

概述

tzinfo是 datetime 模块中的时区信息基类(抽象类),timezone是它的一个具体实现(Python 3.2+)。时区处理是国际化应用中的关键环节,正确使用时区可以避免时间混乱。

维度内容
What时区信息基类(tzinfo)和具体实现(timezone)
Why处理不同时区的时间,支持国际化
When跨时区应用、UTC 时间转换、全球化部署
Wherefrom datetime import tzinfo, timezone
Who需要处理时区的开发者
Howtz = timezone(timedelta(hours=8))

1. 时区基础概念

1.1 naive vs aware

类型说明是否含时区示例
naive不包含时区信息datetime(2026, 4, 19, 14, 30)
aware包含时区信息datetime(2026, 4, 19, 14, 30, tzinfo=timezone.utc)
fromdatetimeimportdatetime,timezone# naive datetime(无时区)naive=datetime.now()print(f"naive:{naive}")print(f"tzinfo:{naive.tzinfo}")# None# aware datetime(有时区)aware=datetime.now(timezone.utc)print(f"aware:{aware}")print(f"tzinfo:{aware.tzinfo}")# UTC

1.2 UTC 和时区偏移

fromdatetimeimportdatetime,timezone,timedelta# UTC 时区utc=timezone.utcprint(f"UTC:{utc}")# 东八区(北京时间)beijing_tz=timezone(timedelta(hours=8))print(f"北京时间:{beijing_tz}")# 纽约时间(西五区)ny_tz=timezone(timedelta(hours=-5))print(f"纽约时间:{ny_tz}")

2. timezone 类

2.1 创建 timezone 对象

fromdatetimeimportdatetime,timezone,timedelta# UTC 时区utc_tz=timezone.utcprint(f"UTC:{utc_tz}")# 固定偏移时区beijing_tz=timezone(timedelta(hours=8))print(f"北京时间:{beijing_tz}")# 带名称的时区named_tz=timezone(timedelta(hours=8),name="Asia/Shanghai")print(f"命名时区:{named_tz}")

2.2 创建 aware datetime

fromdatetimeimportdatetime,timezone,timedelta# 方式1:创建时指定时区dt=datetime(2026,4,19,14,30,0,tzinfo=timezone(timedelta(hours=8)))print(dt)# 2026-04-19 14:30:00+08:00# 方式2:使用 now() 指定时区beijing_now=datetime.now(timezone(timedelta(hours=8)))print(f"北京时间:{beijing_now}")# 方式3:UTC 时间utc_now=datetime.now(timezone.utc)print(f"UTC 时间:{utc_now}")# 方式4:naive → awarenaive=datetime(2026,4,19,14,30,0)aware=naive.replace(tzinfo=timezone(timedelta(hours=8)))print(f"转换后:{aware}")

2.3 timezone 方法

fromdatetimeimportdatetime,timezone,timedelta tz=timezone(timedelta(hours=8),name="Asia/Shanghai")dt=datetime(2026,4,19,14,30,0,tzinfo=tz)# utcoffset() - UTC 偏移print(f"UTC 偏移:{tz.utcoffset(dt)}")# 8:00:00# dst() - 夏令时(固定偏移时区返回 None)print(f"夏令时:{tz.dst(dt)}")# None# tzname() - 时区名称print(f"时区名称:{tz.tzname(dt)}")# Asia/Shanghai# fromutc() - UTC 转本地时间utc_dt=datetime(2026,4,19,6,30,0,tzinfo=timezone.utc)local_dt=tz.fromutc(utc_dt)print(f"UTC 6:30 → 本地:{local_dt}")# 2026-04-19 14:30:00+08:00

3. 时区转换

3.1 astimezone() 方法

fromdatetimeimportdatetime,timezone,timedelta# 创建 UTC 时间utc_dt=datetime(2026,4,19,6,30,0,tzinfo=timezone.utc)print(f"UTC:{utc_dt}")# 转换为北京时间beijing_tz=timezone(timedelta(hours=8))beijing_dt=utc_dt.astimezone(beijing_tz)print(f"北京时间:{beijing_dt}")# 转换为纽约时间ny_tz=timezone(timedelta(hours=-5))ny_dt=utc_dt.astimezone(ny_tz)print(f"纽约时间:{ny_dt}")# 转换为 UTC(不同时区之间转换)back_to_utc=beijing_dt.astimezone(timezone.utc)print(f"转回 UTC:{back_to_utc}")

3.2 时区转换示例

fromdatetimeimportdatetime,timezone,timedelta# 定义时区UTC=timezone.utc CST=timezone(timedelta(hours=8))# 中国标准时间EST=timezone(timedelta(hours=-5))# 美国东部时间PST=timezone(timedelta(hours=-8))# 美国太平洋时间JST=timezone(timedelta(hours=9))# 日本标准时间# 北京时间 14:30beijing_time=datetime(2026,4,19,14,30,0,tzinfo=CST)# 转换为其他时区print(f"北京时间:{beijing_time}")print(f"UTC 时间:{beijing_time.astimezone(UTC)}")print(f"纽约时间:{beijing_time.astimezone(EST)}")print(f"洛杉矶时间:{beijing_time.astimezone(PST)}")print(f"东京时间:{beijing_time.astimezone(JST)}")

4. 实用示例

4.1 判断是否同一时区

fromdatetimeimportdatetime,timezone,timedeltadefsame_timezone(dt1,dt2):"""判断两个 datetime 是否在同一时区"""ifdt1.tzinfoisNoneordt2.tzinfoisNone:returnFalsereturndt1.utcoffset()==dt2.utcoffset()# 示例cst=timezone(timedelta(hours=8))beijing1=datetime(2026,4,19,14,30,0,tzinfo=cst)beijing2=datetime(2026,4,19,16,30,0,tzinfo=cst)utc=datetime(2026,4,19,6,30,0,tzinfo=timezone.utc)print(f"同一时区:{same_timezone(beijing1,beijing2)}")# Trueprint(f"不同时区:{same_timezone(beijing1,utc)}")# False

4.2 转换为本地时间

fromdatetimeimportdatetime,timezone,timedeltaimporttimedefto_local_time(utc_dt):"""将 UTC 时间转换为本地时间"""# 获取本地时区偏移(秒)local_offset=-time.timezone local_tz=timezone(timedelta(seconds=local_offset))returnutc_dt.astimezone(local_tz)# 示例utc_now=datetime.now(timezone.utc)local_now=to_local_time(utc_now)print(f"UTC:{utc_now}")print(f"本地:{local_now}")

4.3 获取当前各时区时间

fromdatetimeimportdatetime,timezone,timedelta# 常用时区ZONES={"UTC":timezone.utc,"北京时间":timezone(timedelta(hours=8)),"东京时间":timezone(timedelta(hours=9)),"纽约时间":timezone(timedelta(hours=-5)),"伦敦时间":timezone(timedelta(hours=0)),"悉尼时间":timezone(timedelta(hours=11)),}print("世界各地当前时间:")print("="*40)forname,tzinZONES.items():now=datetime.now(tz)print(f"{name:8}:{now.strftime('%Y-%m-%d %H:%M:%S')}")

4.4 时间戳与时区

fromdatetimeimportdatetime,timezone,timedelta# 时间戳是 UTC 时间timestamp=1745030000# 转换为不同时区的 datetimeutc_dt=datetime.fromtimestamp(timestamp,tz=timezone.utc)beijing_dt=datetime.fromtimestamp(timestamp,tz=timezone(timedelta(hours=8)))print(f"时间戳:{timestamp}")print(f"UTC 时间:{utc_dt}")print(f"北京时间:{beijing_dt}")# datetime 转时间戳(注意:naive datetime 会被当作本地时间)naive_dt=datetime(2026,4,19,14,30,0)aware_dt=naive_dt.replace(tzinfo=timezone(timedelta(hours=8)))print(f"naive 时间戳:{naive_dt.timestamp()}")print(f"aware 时间戳:{aware_dt.timestamp()}")

5. zoneinfo 模块(Python 3.9+)

5.1 ZoneInfo 基础

fromdatetimeimportdatetimefromzoneinfoimportZoneInfo# 创建时区对象shanghai_tz=ZoneInfo("Asia/Shanghai")tokyo_tz=ZoneInfo("Asia/Tokyo")newyork_tz=ZoneInfo("America/New_York")london_tz=ZoneInfo("Europe/London")# 创建 aware datetimenow_shanghai=datetime.now(shanghai_tz)print(f"上海:{now_shanghai}")# 时区转换now_tokyo=now_shanghai.astimezone(tokyo_tz)print(f"东京:{now_tokyo}")

5.2 可用时区列表

fromzoneinfoimportZoneInfo,available_timezones# 获取所有可用时区all_zones=available_timezones()print(f"总时区数:{len(all_zones)}")# 搜索中国相关时区china_zones=[zforzinall_zonesifz.startswith("Asia/Shang")]print(f"中国时区:{china_zones}")# 搜索美国相关时区us_zones=[zforzinall_zonesifz.startswith("America/")][:10]print(f"美国时区示例:{us_zones}")

6. 完整示例

fromdatetimeimportdatetime,timezone,timedeltafromzoneinfoimportZoneInfoprint("="*50)print("时区处理综合示例")print("="*50)# 1. naive vs awareprint("\n1. naive vs aware")naive=datetime.now()aware=datetime.now(timezone.utc)print(f"naive:{naive}(tzinfo={naive.tzinfo})")print(f"aware:{aware}(tzinfo={aware.tzinfo})")# 2. 创建 timezoneprint("\n2. 创建 timezone")beijing_tz=timezone(timedelta(hours=8))tokyo_tz=timezone(timedelta(hours=9))ny_tz=timezone(timedelta(hours=-5))print(f"北京时间:{beijing_tz}")print(f"东京时间:{tokyo_tz}")print(f"纽约时间:{ny_tz}")# 3. 时区转换print("\n3. 时区转换")utc_time=datetime(2026,4,19,6,30,0,tzinfo=timezone.utc)beijing_time=utc_time.astimezone(beijing_tz)tokyo_time=utc_time.astimezone(tokyo_tz)ny_time=utc_time.astimezone(ny_tz)print(f"UTC:{utc_time}")print(f"北京:{beijing_time}")print(f"东京:{tokyo_time}")print(f"纽约:{ny_time}")# 4. ZoneInfo(Python 3.9+)print("\n4. ZoneInfo 示例")try:shanghai_tz=ZoneInfo("Asia/Shanghai")now_shanghai=datetime.now(shanghai_tz)print(f"上海时间:{now_shanghai}")exceptExceptionase:print(f"ZoneInfo 不可用:{e}")# 5. 实用功能print("\n5. 实用功能")# 判断夏令时print(f"北京时区是否有夏令时:{beijing_tz.dst(None)}")print(f"UTC 偏移:{beijing_tz.utcoffset(None)}")

7. 常见陷阱

陷阱说明解决方案
naive 与 aware 比较不同时区类型不能直接比较统一转换为 aware
夏令时timezone不支持夏令时使用zoneinfo.ZoneInfo
utcnow() 废弃Python 3.12+ 已废弃使用datetime.now(timezone.utc)
时区名称固定偏移没有标准名称使用zoneinfo获取 IANA 名称

8. timezone vs zoneinfo 对比

特性timezonezoneinfo
Python 版本3.2+3.9+
夏令时支持
历史时区数据
时区名称自定义IANA 标准
使用难度简单中等
推荐场景固定偏移时区完整时区支持

9. 总结

类型说明创建方式
naive无时区信息datetime.now()
aware有时区信息datetime.now(timezone.utc)
timezone固定偏移时区timezone(timedelta(hours=8))
ZoneInfoIANA 时区ZoneInfo("Asia/Shanghai")
转换时区转换dt.astimezone(new_tz)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/10 21:00:52

【20年会展技术顾问亲测】:奇点大会步行5分钟内7家酒店真实体验报告(附WiFi速率夜间降噪分贝实测)

更多请点击: https://intelliparadigm.com 第一章:奇点智能技术大会周边酒店推荐 核心推荐区域:中关村软件园及海淀五道口商圈 奇点智能技术大会主会场常年设于北京中关村软件园创新中心,交通便利、地铁10号线/16号线双覆盖。为…

作者头像 李华
网站建设 2026/5/10 20:59:50

2026届毕业生推荐的十大AI学术助手推荐榜单

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 人工智能技术已经深度地融入到了学术写作的流程当中,在毕业论文的撰写期间&#…

作者头像 李华
网站建设 2026/5/10 20:58:15

从抓包实战看LTE附着:用Wireshark一步步解析NAS和RRC信令(附pcap文件)

从抓包实战看LTE附着:用Wireshark一步步解析NAS和RRC信令 在移动通信网络优化和故障排查中,信令分析是最核心的技能之一。想象一下这样的场景:当用户投诉4G网络无法正常接入,或者切换频繁导致掉话时,作为网络工程师的你…

作者头像 李华
网站建设 2026/5/10 20:56:14

AIGC平台不是搭出来,是“炼”出来的:20年AI基础设施专家亲授——用1套标准化SLO框架驱动模型、数据、算力、策略四维协同

更多请点击: https://intelliparadigm.com 第一章:AIGC平台不是搭出来,是“炼”出来的:20年AI基础设施专家亲授——用1套标准化SLO框架驱动模型、数据、算力、策略四维协同 真正的AIGC平台不是堆砌组件的工程产物,而是…

作者头像 李华
网站建设 2026/5/10 20:54:57

数字孪生、视频孪生和镜像孪生的未来发展趋势是什么?

数字孪生、视频孪生和镜像孪生的未来发展趋势是什么?一、数字孪生:从静态沙盘到全域智能体核心趋势:AI 驱动自主决策、全空间覆盖、轻量化普惠智能化升级:从 “可视化展示” 转向 “感知 - 分析 - 决策 - 控制” 闭环,…

作者头像 李华