Python pytz:将本地时间转换为 UTC。本地化似乎没有转换
Posted
技术标签:
【中文标题】Python pytz:将本地时间转换为 UTC。本地化似乎没有转换【英文标题】:Python pytz: convert local time to utc. Localize doesn't seem to convert 【发布时间】: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)
【问题讨论】:
【参考方案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)
但这可能不是必需的,这取决于您的数据库驱动程序的健全程度。 t
和 t_utc
代表相同的时间点,行为良好的代码应该互换处理它们。 (year, month, day, hour, minute, second, …)
元组只是特定时区和日历系统中此时间点的人类可读表示。
【讨论】:
以上是关于Python pytz:将本地时间转换为 UTC。本地化似乎没有转换的主要内容,如果未能解决你的问题,请参考以下文章