我在Linux上使用Python 3.10.4,试图将表示UTC的datetime个简单对象转换为本地时间(UTC+1+DST).

让我困惑的是,将原始日期时间转换为UTC似乎考虑了本地时区,尽管它的tzinfoNone(这是应该的)-而相反,即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/上运行代码会得到不同的结果).

推荐答案

创建这样的datetime对象时:

naive = datetime.datetime(2022,7,7,8,2,34)

创建一个naive对象(不知道时区).遵循文件:

原始对象是否表示协调世界时(UTC)、本地时间或

我想你期望这个对象代表UTC时间,但这不是真的.它只是不知道时区,所以时区无论如何都可以解释.

让我们看看astimezone方法的源代码:

def astimezone(self, tz=None):

    ....

    mytz = self.tzinfo
    if mytz is None:
        mytz = self._local_timezone()
        myoffset = mytz.utcoffset(self)
    else:
       
    ....

    # Convert from UTC to tz's local time.
    return tz.fromutc(utc)

当你看到自己的时候.tzinfo为None,则将其解释为本地时区,而不是UTC

您提供的其他示例都知道时区.

Python相关问答推荐

PywinAuto在Windows 11上引发了Memory错误,但在Windows 10上未引发

查找两极rame中组之间的所有差异

Pandas - groupby字符串字段并按时间范围 Select

从dict的列中分钟

为什么sys.exit()不能与subproccess.run()或subprocess.call()一起使用

django禁止直接分配到多对多集合的前端.使用user.set()

avxspan与pandas period_range

如果值发生变化,则列上的极性累积和

改进大型数据集的框架性能

Python脚本使用蓝牙运行在Windows 11与raspberry pi4

网格基于1.Y轴与2.x轴显示在matplotlib中

如何使用OpenGL使球体遵循Python中的八样路径?

为罕见情况下的回退None值键入

python3中np. divide(x,y)和x/y有什么区别?'

仅取消堆叠最后三列

如何将验证器应用于PYDANC2中的EACHY_ITEM?

无法使用请求模块从网页上抓取一些产品的名称

Pandas:使列中的列表大小与另一列中的列表大小相同

基于2级列表的Pandas 切片3级多索引

根据两个lambda条件筛选组并根据条件创建新列的最佳方式是什么?