我正在try 使用时区.我处于US/Mountain时区,而我的计算机(Windows)已配置为该时区.

import datetime
import zoneinfo

utc = zoneinfo.ZoneInfo('UTC')
mt = zoneinfo.ZoneInfo('US/Mountain')

print(datetime.datetime.now())
print(datetime.datetime.now().astimezone(mt))
print(datetime.datetime.now().astimezone(utc))

# 2023-10-27 13:17:18.840857
# 2023-10-27 13:17:18.840857-06:00
# 2023-10-27 19:17:18.840857+00:00

最后一行让我很困惑,我以为代码datetime.datetime.now()创建了一个时区对象,然后astimezone(utc)将其转换为一个时区感知对象,但并没有改变时间的"值".但是在这里你可以看到,astimezone(utc)导致6小时被添加到时间的值中,就好像datetime.datetime.now()生成的时间是一个山区时间对象.

推荐答案

请参见the docs on astimezone:

返回一个具有新的tzinfo属性tz的DateTime对象,调整日期和时间数据,以使结果为与self相同的UTC时间,但使用tz的本地时间.

如果提供,tz必须是tzinfo子类的实例,并且它的utcoviset()和dst()方法不能返回None.如果self为naive,则假定表示系统时区中的时间.

...

如果您只想将时区对象tz附加到DateTime DT而不调整日期和时间数据,请使用dt.replace(tzinfo=tz).如果您只想从Aware DateTime DT中删除时区对象,而不转换日期和时间数据,请使用dt.replace(tzinfo=None).

如果我使用replace,我会得到预期的行为:

import datetime
import zoneinfo

utc = zoneinfo.ZoneInfo('UTC')
mt = zoneinfo.ZoneInfo('US/Mountain')

print(datetime.datetime.now())
print(datetime.datetime.now().replace(tzinfo=mt))
print(datetime.datetime.now().replace(tzinfo=utc))

# 2023-10-27 13:45:35.897159
# 2023-10-27 13:45:35.897159-06:00
# 2023-10-27 13:45:35.897159+00:00

在我的代码中发生的是,当我使用astimezone()时,datetime模块确实从我的系统时间推断出一个时区,然后使用它将时间转换为utc的时间.replace是一个功能,可以用来"插入"一个时区而不进行调整.

Python相关问答推荐

如何使用Tkinter的CheckButtom隐藏或显示由滑块控制的画布线?

在Python中比较函数参数和回调函数的正确方法

没有与提供的参数匹配

如何在Python中以一种安全的方式获取Git提交散列

提供不正确结果的Python IP验证

压平JSON后的Pandas 保留柱

用于具有多个输出的函数的JAX`Custom_vjp`

我无法用python语言中的matplotlib来绘制一个简单的图形,该图形以列表中给出的5处的X值开始

在Python中,i:int=1和i=int(1)有什么不同?

`jax.grad`的矢量化能力

在不使用setOffset的情况下取消轴标签上的科学记数法

已解决:Python数据类中的方法关联

Python和Rust之间传递整数的安全性

Python:在字符串列表中搜索子字符串列表

如何连接两口井?

如何在matplotlib中强调圆的一部分

在Python中使用索引修改元素

是否应该在其他子类继承的类中使用名称重写?

模块没有属性Partial_Ratio;和其他奇怪的错误

如果A的子串在一个DF的B的串中,则不 Select 行