Python时区转换将小时增加了几分钟?

时间:2019-01-17 18:49:38

标签: python-3.x datetime date-conversion python-dateutil

因此,我试图将一小时(10:00:00、14:00:00等)从给定时区转换为UTC。

这样做的时候,我一直在疯狂地取回东西,例如“ 15:51:00”。

到达该行并打印其使用的值时,它会使用类似的东西:

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

除了-05:51位之外,哪个都可以。我不知道为什么-05:51在那里,这给我带来了麻烦。 UTC转换是小时到小时,是吗?我认为这与我的时区转换有关,但我真的不知道为什么他们会这样做。

这是一个具有相同错误输出的最小示例;当它只应返回固定时间(无分钟)时,它将返回15:51:00

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"))

1 个答案:

答案 0 :(得分:2)

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

至少要使用一个最近的日期,例如 today 例如:

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

如果您只需要时间 ,则不要创建datetime对象来存储这些对象; datetime模块具有专用的time()对象。我也不会使用strftime()从文字中创建对象。只需使用构造函数来传递整数:

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

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