将UTC日期时间转换为用户本地日期时间

5 投票
3 回答
3869 浏览
提问于 2025-04-16 06:41

我在使用Python和Django框架,同时也在使用Google App Engine。我在我的一个模型里用到了DateTimeProperty。有时候我想把这个日期和时间显示给用户。

那么,怎么才能把存储在DateTimeProperty里的日期时间转换成用户的日期时间呢?

或者更准确地说,我想问的是:有什么好的方法可以获取用户的时区,并把Python的日期时间对象转换成他们自己当地的时间呢?

3 个回答

0

在模板中将Google App Engine的日期时间转换成最简单的方法:

http://code.google.com/p/dateconv4gae/

3

我做了一些额外的研究。要正确处理时区问题,你需要按照Tomasz在他的回答中描述的方法来做。不过,如果你愿意接受一些小的折衷,你可以用更少的努力达到90%的效果。

当用户登录或在你的网站上进行任何操作时,你可以使用JavaScript获取他们当前的时区偏移,然后在下一个请求中发送这个信息:

var offset = (new Date()).getTimezoneOffset()
$.post("post.html", "offset="offset.toString(), ... );

当然,这个方法是建立在用户正确设置了他们当前时区的基础上的。关于这个问题,很多其他网站也有讨论:

9

这其实是个关于Python的问题,而不是关于GAE(Google App Engine)的问题,除非GAE有一些工具可以帮助你做到这一点(我快速查了一下,但没找到相关的资料)。

简单来说,你想要把日期和时间存储为UTC时区(比如使用datetime.datetime.utcnow),同时还要记录用户的时区。你可以尝试通过用户的IP地址来获取他们的时区(如果GAE上有GeoDjango,或者使用pygeoip;你需要一些地理位置数据库,比如:http://www.maxmind.com/app/geolitecity),或者直接询问用户的时区——这样做的好处是你可以要求用户提供一个具体的时区名称,比如“Europe/Warsaw”。如果你只是问用户“UTC+2”,那么你就无法知道夏令时的变化了。

接下来,你可以使用例如pytz来将UTC时间转换为所需的时区:

import pytz
local_tz = pytz.timezone(timezone_name)
return timestamp_utc.replace(tzinfo=pytz.utc).astimezone(local_tz).replace(tzinfo=None)

-- 这里的timestamp_utc是你想要转换的UTC时间,timezone_name就是之前提到的“Europe/Warsaw”。

(注意,我不知道这些在GAE上哪个能用,但至少你知道该找什么了)

撰写回答