15

我有一个将日期时间存储为 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)

4

2 回答 2

26

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
于 2012-11-12T15:03:38.480 回答
0

如果您知道传入的时间表示在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, …)组只是特定时区和日历系统中此时间点的人类可读表示。

于 2012-11-12T15:09:47.047 回答