【问题标题】:Python timezone conversion adding minutes to the hour?Python时区转换将分钟添加到小时?
【发布时间】:2019-06-12 00:53:36
【问题描述】:

所以我试图将给定时区的几个小时(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"))

【问题讨论】:

  • 您需要使用localize() 方法,否则您将获得历史时区偏移量。
  • 你至少能把它简化为一个最小的例子吗?我们不需要所有这些字典定义。
  • Python 3.7,dateutil 版本 2.7.5。
  • 我没有看到完全相同的偏移量可能是由于操作系统的差异。我在 Mac OS 10.13 上运行它,我会从你的系统中获得不同的时区文件,和/或 gettz() 在你的系统上返回一个不同的特定时区类实例。
  • print(tzz.utcoffset(jj)) 为您带来了什么?

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


【解决方案1】:

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

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

# 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 对象。如果您只有一天中的某个时间,但仍需要时区支持,请将它们附加到今天的日期,以便获得正确的时区。尽可能晚地再次转换为字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-28
    • 2019-01-05
    • 1970-01-01
    • 2015-05-18
    • 1970-01-01
    • 2018-12-26
    • 2021-02-22
    • 2014-12-01
    相关资源
    最近更新 更多