【问题标题】:Python pytz: convert local time to utc. Localize doesn't seem to convertPython pytz:将本地时间转换为 UTC。本地化似乎没有转换
【发布时间】:2012-11-01 00:12:23
【问题描述】:

我有一个将日期时间存储为 UTC 的数据库。我需要查找特定时间的信息,但日期和时间是以当地时间给出的,比如说“欧洲/哥本哈根”。我得到了这些:

year = 2012; month = 12; day = 2; hour = 13; min = 1;

所以,我需要将这些转换为 UTC,以便我可以在数据库中查找它们。我想使用pytz 来做到这一点。我在看localize

 local_tz = timezone('Europe/Copenhagen')
 t = local_tz.localize(datetime.datetime(year, month, day, hour, min))

但我对localize() 感到困惑。这是假设年份等是在当地时间给我的吗?或者,是否假设它们是以 UTC 给出的,现在它已将它们转换为本地时间?

print t 给我:

2012-12-02 13:01:00+01:00

所以它似乎假设原来的年份等是UTC;小时数现在是 13+1 而不是 13。那么我应该怎么做呢?我已经阅读了 pytz 文档,但这并没有让我更清楚。它提到了很多事情很棘手,所以我不确定 pytz 是否真的在解决这些问题。而且,我并不总是知道这些示例是否向我展示了有效的东西或无效的东西。

我尝试过标准化:

print local_tz.normalize(t)

这给了我与 print t 相同的结果。

编辑:根据上面给出的年份等数字,它应该与数据库中 2012-12-2 12:01 的信息相匹配。 (因为哥本哈根在那个日期是 utc+1)

【问题讨论】:

    标签: python timezone pytz


    【解决方案1】:

    localize() 将时区附加到 本地 时区中的幼稚 datetime.datetime 实例。

    如果您有本地时区的日期时间值,请本地化到该时区,然后使用 .astimezone() 将值转换为 UTC:

    >>> localdt = local_tz.localize(datetime.datetime(year, month, day, hour, min))
    >>> localdt.astimezone(pytz.UTC)
    datetime.datetime(2012, 12, 2, 12, 1, tzinfo=<UTC>)
    

    请注意,您不需要这样做,datetime 对象与时区 可以比较;它们都将被标准化为 UTC 以进行测试:

    >>> localdt.astimezone(pytz.UTC) == localdt
    True
    

    【讨论】:

    • 表示小时为 14:01:00+01:00。正确的当地时间是 13,UTC 时间是 12。
    • @user984003:啊,抱歉,第一句话看错了。 .astimezone() 仍然是要走的路,正好相反。
    • 是的,第二种方法有效,谢谢。你能不能把它写在你的答案中,否则我认为这有点令人困惑;)我看到我对打印的日期感到困惑。 “+01:00”告诉我它比世界标准时间早一小时,而不是我应该在时间上增加一小时。
    • @user984003:已更新,并附有关于datetime.datetime 的时区感知实例比较的说明。
    • 谢谢。是的,现在这是回答我问题的第一个答案。
    【解决方案2】:

    如果您知道传入的时间表示在 Europe/Copenhagen 时区,您可以将其创建为时区感知开始:

    local_tz = timezone('Europe/Copenhagen')
    t = local_tz.localize(datetime.datetime(year, month, day, hour, min))
    

    然后您可以将其“转换”为UTC

    t_utc = t.astimezone(pytz.UTC)
    

    但这可能不是必需的,这取决于您的数据库驱动程序的健全程度。 tt_utc 代表相同的时间点,行为良好的代码应该互换处理它们。 (year, month, day, hour, minute, second, …) 元组只是特定时区和日历系统中此时间点的人类可读表示。

    【讨论】:

      猜你喜欢
      • 2014-10-05
      • 2017-03-10
      • 2020-08-05
      • 2021-08-02
      • 2018-10-30
      • 2019-01-05
      • 1970-01-01
      • 2018-07-27
      • 2011-10-11
      相关资源
      最近更新 更多