Python pytz:将本地时间转换为UTC。本地化似乎无法转换

19

我有一个数据库,将日期时间存储为UTC。我需要查找特定时间的信息,但日期和时间以本地时间给出,比如说 'Europe/Copenhagen'。我得到的是:

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实际上是否解决了这些问题。而且,我并不总是知道示例是展示可以工作的还是不行的。

我尝试使用normalize:

print local_tz.normalize(t)

这会给我和print t相同的结果。

编辑:使用上述提供的年份等数字,它应该与数据库中2012-12-2 12:01的信息相匹配。(因为在那天哥本哈根是utc+1时区)

2个回答

29

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
@user984003:啊,抱歉,我误读了第一句话。.astimezone() 仍然是正确的方法,只是方向相反。 - Martijn Pieters
是的,第二种方法可行,谢谢。你能在你的答案中加上这个吗?否则我觉得有点混淆了 ;) 我看到我对打印日期感到困惑了。"+01:00"告诉我它比UTC提前一小时,而不是我应该在时间上加一小时。 - user984003
@user984003:已更新,附有关于比较带时区的 datetime.datetime 实例的说明。 - Martijn Pieters
谢谢。是的,现在第一个回答回答了我的问题。 - user984003

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 表示相同的时间点,良好的代码应该可以互换使用它们。 (年、月、日、时、分、秒、...) 元组仅是该时间点在特定时区和日历系统中的人类可读表示。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接