2010-11-06 179 views
5

我在Django和Google App Engine上使用python。我也在我的一个模型中使用DateTimeProperty。偶尔我想向用户显示该日期和时间。将UTC日期时间转换为用户的本地日期和时间

什么是最好的将DateTimeProperty中存储的日期时间转换为用户的日期时间?

或者更精确的问题框架:获取客户端时区并将python日期时间对象转换为他们自己的本地时间的最佳方式是什么?

+0

可能重复:http://stackoverflow.com/questions/4065157/django-time-issues/4065236#4065236 – mouad 2010-11-06 21:49:44

+0

只是想出了接受是...谢谢 – speedplane 2010-11-07 19:53:41

回答

8

这是一个比GAE更Python的问题,除非GAE有一些基础设施来促进这一点(我做了一个快速扫描,但没有找到任何参考)。基本上,您希望将UTC时区中的日期/时间(例如,使用datetime.datetime.utcnow)与用户时区一起存储,您可以尝试从用户IP中提取(使用GeoDjango,如果在GAE上可用,或者pygeoip;你需要一些地理位置数据库,例如:http://www.maxmind.com/app/geolitecity),或者明确地询问用户有关它的优势 - 你可以要求描述性时区名称,比如“Europe/Warsaw”。如果你只要求UTC + 2,那么你就没有任何DST转换的迹象。

然后,您可以使用例如从utc转换到所需的时区。 pytz

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是提到的 “欧洲/华沙”。

(请注意,我不知道这在GAE这些作品,但至少你会知道要寻找什么)

+0

这比我想象的更复杂。明确地询问用户是不可能的。 GeoDjango看起来像一个大型的图书馆,用于各种与GEO有关的东西,我只想将IP地址转换为时区。即使pytz似乎真的很大。 – speedplane 2010-11-07 20:24:27

3

所以,我做了些研究这个。要正确做时区,你必须遵循Tomasz在答案中所描述的内容。然而,如果你愿意容忍一点混乱,你可以用更少的努力获得90%的回报。

当用户登录或没有网站上的任何动作,您可以使用JavaScript来获得他们目前的时区偏移量,然后在你的下一个请求发送:

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

当然,这假定用户已正确设置其当前时区。这是在其他一些网站的讨论:

+0

啊,非常好,我不知道这个。不过,如果你开发了例如一个CRM,那么你不能忽视像DST这样的微妙之处。 – 2010-11-07 22:42:26

相关问题