在GAE上,如何根据正确的客户端时区显示日期?
在我的Google App Engine应用程序中,我在模型里存储了一个自动更新的日期/时间,像这样:
class MyModel(db.Model):
date = db.DateTimeProperty(auto_now_add=True)
但是,这个日期/时间是服务器上的本地时间,取决于它的时区。
所以,当我想在我的网页上显示这个时间时,我该如何根据客户端的时区来格式化它呢?
另外,我怎么知道那个Google服务器使用的是哪个时区呢?
3 个回答
你可以通过询问服务器的本地时间和UTC时间,来了解服务器的时区,并查看它们之间的差异。要找出客户端的时区,你需要在你的模板中加一点JavaScript代码,这样就能通过AJAX请求获取相关信息。发现时区差异后,如果你想处理这些时区,我推荐使用pytz这个库,网址是pytz.sourceforge.net/。
好的,感谢Thomas L Holaday的帮助,我需要把这个UTC日期发送给客户端,比如用JSON格式:
json = '{"serverUTCDate":new Date("%s")}' % date.ctime()
然后,在客户端那边,根据用户的时区来加或减秒数,像这样:
var localDate = serverUTCDate.getTime() - (new Date()).getTimezoneOffset()*60000;
关于你问题的第二部分:
Python的time()函数返回的是协调世界时(UTC),无论服务器在哪个时区。timezone()和tzname()分别会告诉你服务器的本地时间偏差和时区名称,以及夏令时的时区,结果是一个元组。GAE(Google App Engine)在这篇文章发布时使用的是Python 2.5.x;你可以在这里查看Python时间函数的文档:这里。
关于问题的第一部分:
你可以选择在服务器上格式化日期,或者在客户端上格式化日期。
如果你选择在服务器上格式化,可以:
- 使用请求者IP地址的时区
- 要求用户注册并提供他们的时区,存储这个信息,然后使用存储的值
- 在GET或POST请求中使用一个(隐藏的?)字段,让客户端希望使用的时区成为请求的一部分
如果你选择在客户端格式化,你需要写几行JavaScript代码。过程大致是“用Date(utctime)从UTC创建一个日期,然后把它放到文档里。”默认情况下,JavaScript日期会显示为本地时间,无论它们是如何初始化的——太棒了!
我推荐在客户端格式化,因为没有一点JavaScript,网页会是什么样子呢?这是2009年!Marcelo有一些示例。