我有一个将日期时间存储为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)
答案 0 :(得分:19)
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
答案 1 :(得分: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)
但这可能没有必要,具体取决于数据库驱动程序的理智程度。 t
和t_utc
代表相同的时间点,行为良好的代码应该互换地对待它们。 (year, month, day, hour, minute, second, …)
元组仅仅是特定时区和日历系统中此时间点的人类可读表示。