提问人:mon 提问时间:10/30/2023 更新时间:10/30/2023 访问量:58
python - 关于相同时区字符串格式的说明
python - explanation on different timezone string format for the same
问:
为什么使用 timezone 创建会为其属性提供不同的时区字符串?datetime.datetime
zoneinfo.ZoneInfo
tzinfo
Using ZoneInfo document说道:
ZoneInfo 是 datetime.tzinfo 抽象基类的具体实现,旨在通过构造函数、datetime.replace 方法或 datetime.astimezone 附加到 tzinfo:
如果附加到使用它创建的日期时间实例,那么为什么使用澳大利亚/墨尔本创建会给出不同的名称 AEDT?ZoneInfo
tzinfo
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 和澳大利亚/墨尔本。
答:
1赞
FObersteiner
10/30/2023
#1
请注意,您在这里处理的是两种不同的情况。#1 您设置了时区。#2 您设置了一个派生的时区。澄清一下:zoneinfo.ZoneInfo
timedelta
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()
评论
Australia/Melbourne
'AEST'
'AET'
datetime.datetime.now(tz=zoneinfo.ZoneInfo("AEDT")).astimezone().tzinfo.zone