Python 时区转换将分钟加到小时?

Python timezone conversion adding minutes to the hour?

所以我正在尝试将给定时区的大量时间(10:00:00、14:00:00 等)转换为 UTC。

当我这样做的时候,我总是疯狂地得到像“15:51:00”这样的东西。

当您到达该行并打印它正在使用的值时,它使用的是:

1900-01-01 12:00:00-05:51

很好,除了 -05:51 位。我不知道为什么 -05:51 在那里,这给我带来了问题。 UTC 转换是按小时计算的,是吗?我认为这与我的时区转换有关,但我真的不明白他们为什么要那样做。

这是一个具有相同错误输出的最小示例;它 returns 15:51:00 应该 return 一个小时,没有分钟。

import datetime
from dateutil import tz

jj = datetime.datetime.strptime("10:00:00", "%H:%M:%S")

tzz = tz.gettz('US/Central')

def constructstring(tzz,x):
    inter2 = x.replace(tzinfo=tzz) #ERROR HAPPENS HERE (I'm pretty sure anyways)
    inter3 = inter2.astimezone(tz.tzutc())
    return inter3

print(constructstring(tzz,jj).strftime("%H:%M:%S"))

创建 jj 日期时间对象时未指定日期,因此使用默认日期 1900-01-01。时区不是固定的实体;它们会随着时间而改变,US/Central 时区在 1900 年使用了不同的偏移量。

至少,使用最近的日期,例如今天

# use today's date, with the time from jj, and a given timezone.
datetime.datetime.combine(datetime.date.today(), jj.time(), tzinfo=tzz)

如果您只需要 time,那么不要创建 datetime 对象来存储它们; datetime 模块有一个专用的 time() 对象。我也不会使用 strftime() 从文字创建对象。使用构造函数传入整数即可:

jj = datetime.time(10, 0, 0)  # or just .time(10)

其他好的经验法则:如果您必须处理带时区的日期,请尝试在您的代码接收或加载它们时将它们移动到 UTC 中的 datetime 对象。如果您只有一天中的某个时间,但仍需要时区支持,请将它们附加到今天的日期,这样您就可以获得正确的时区。尽可能晚地再次转换为字符串。