python - 关于相同时区字符串格式的说明

python - explanation on different timezone string format for the same

提问人:mon 提问时间:10/30/2023 更新时间:10/30/2023 访问量:58

问:

为什么使用 timezone 创建会为其属性提供不同的时区字符串?datetime.datetimezoneinfo.ZoneInfotzinfo

Using ZoneInfo document说道:

ZoneInfo 是 datetime.tzinfo 抽象基类的具体实现,旨在通过构造函数、datetime.replace 方法或 datetime.astimezone 附加到 tzinfo:

如果附加到使用它创建的日期时间实例,那么为什么使用澳大利亚/墨尔本创建会给出不同的名称 AEDTZoneInfotzinfo

datetime.datetime.now(tz=zoneinfo.ZoneInfo("Australia/Melbourne")).astimezone().tzinfo
---
datetime.timezone(datetime.timedelta(seconds=39600), 'AEDT')

并且 AEDT 不被 识别。ZoneInfo

datetime.datetime.now(tz=zoneinfo.ZoneInfo("AEDT")).astimezone().tzinfo
---
ZoneInfoNotFoundError: 'No time zone found with key AEDT'

请帮助了解这里的不同之处以及如何在不同时区字符串之间进行互操作,例如 AEDT澳大利亚/墨尔本

Python 日期时间 时区

评论

0赞 deceze 10/30/2023
墨尔本根据一年中的时间在 AEST 和 AEDT 之间切换。这就是为什么您通常不使用这两个时区中的任何一个实例化时间的原因,因为它们甚至可能不存在(尝试使用冬季时区在夏季创建时间没有多大意义)。因此,您应该使用位置名称行,然后让 Python 决定 AEDT 或 AEST 是否合适。显然 ZoneInfo 甚至不支持直接实例化 AEDT,但我不确定那里的细节。Australia/Melbourne
0赞 Mark Ransom 10/30/2023
做还是工作?什么是回报?'AEST''AET'datetime.datetime.now(tz=zoneinfo.ZoneInfo("AEDT")).astimezone().tzinfo.zone

答:

1赞 FObersteiner 10/30/2023 #1

请注意,您在这里处理的是两种不同的情况。#1 您设置了时区。#2 您设置了一个派生的时区。澄清一下:zoneinfo.ZoneInfotimedelta

from datetime import datetime
from zoneinfo import ZoneInfo

#1
now_tz = datetime.now(ZoneInfo("Europe/Berlin"))
print(now_tz.tzinfo)
print(repr(now_tz.tzinfo))
# Europe/Berlin
# zoneinfo.ZoneInfo(key='Europe/Berlin')

#2
now_local = datetime.now().astimezone()
print(now_local.tzinfo)
print(repr(now_local.tzinfo))
# CET
# datetime.timezone(datetime.timedelta(seconds=3600), 'CET')

虽然 zoneinfo 为您提供了一个正确的 IANA db tz 名称(而不是可能不明确的缩写),但 timedelta-tz 只有缩写。 调用 _local_timezone,它调用平台的 mktime 实现。如果这只是给你一个缩写,那么这个缩写就是 Python 可以向你展示的全部内容。astimezone(None)

旁注:要获取所有可用的时区,请使用 。另请参阅此处zoneinfo.available_timezones()