我在Linux上使用Python 3.10.4,试图将表示UTC的datetime
个简单对象转换为本地时间(UTC+1+DST).
让我困惑的是,将原始日期时间转换为UTC似乎考虑了本地时区,尽管它的tzinfo
是None
(这是应该的)-而相反,即try 将原始或感知(设置为UTC)的日期时间转换为本地timezone
,似乎没有考虑DST.
只有在使用zoneinfo(3.9中新增)而不是timezone
时,这才起到预期效果.
import datetime
print("naive as UTC")
# naive local time UTC+1 (DST +1)
# -> UTC 22-07-07 06:02:34
naive = datetime.datetime(2022,7,7,8,2,34)
print( naive )
utc = naive.astimezone(datetime.timezone.utc)
print(utc)
print("UTC as local")
utc = datetime.datetime(2022,7,7,8,2,34,tzinfo=datetime.timezone.utc)
print( utc )
tz = datetime.timezone( datetime.timedelta(hours=1) )
local = naive.astimezone(tz)
print(local, local.dst() )
print("UTC as local with zoneinfo")
import zoneinfo
local = utc.astimezone(zoneinfo.ZoneInfo("Europe/Berlin"))
print(local, local.dst() )
输出
naive as UTC
2022-07-07 08:02:34
2022-07-07 06:02:34+00:00
UTC as local
2022-07-07 08:02:34+00:00
2022-07-07 07:02:34+01:00 None
UTC as local with zoneinfo
2022-07-07 10:02:34+02:00 1:00:00
另一方面,"UTC作为本地"的代码似乎处理DST,但不处理UTC偏移:
UTC as local
2022-07-07 08:02:34+00:00
2022-07-07 07:02:34+01:00 None
UTC as local
2022-01-07 08:02:34+00:00
2022-01-07 08:02:34+01:00 None
虽然我使用zoneinfo
得到了预期的结果,但我想了解其他"转换"发生了什么,以及系统时钟为什么会影响它们(在https://www.python.org/shell/上运行代码会得到不同的结果).