时区和本地化

时间:2011-11-10 04:37:54

标签: python django timezone python-datetime

我目前正在以UTC格式存储所有时间,以便在我开始将多个站点和服务器联机时更轻松。

datedatetime对象转换为模板中的字符串以及接受用户输入时,会出现问题。 UTC时间下午6点对于在PST的人来说并不意味着很多。同样,要求用户输入UTC时间就是要求发生灾难。

如何以智能,不易出错的方式正确翻译这些值?有没有办法可以从HTTP请求中确定用户所在的时区?我真的需要一种方法来尽可能少地确定用户的时区。

5 个答案:

答案 0 :(得分:1)

我已经这样做了。您可能需要easy_install pytz用于时区对象。

import pytz
import time
import datetime
d = time.time()

print datetime.datetime.fromtimestamp(d, pytz.timezone('US/Eastern'))
print datetime.datetime.fromtimestamp(d, pytz.timezone('US/Central'))
print datetime.datetime.fromtimestamp(d, pytz.timezone('US/Mountain'))
print datetime.datetime.fromtimestamp(d, pytz.timezone('US/Pacific'))

此处的d变量将UTC时间存储为unix时间戳。

答案 1 :(得分:1)

依靠客户自行报告时区的问题在于,总有一个机会(有多大机会可辩论),你真正得到的是 UTC偏移。如果你得到一个UTC偏移量,你的逻辑大部分时间都可以正常工作,但实际上只适用于客户端产生的确切时间戳。任何过去或将来的时间可能具有不同的UTC偏移,并且如果没有适当的时区数据库则无法预测。在夏令时边界附近,使用UTC偏移会产生灾难性的错误结果。

即便如此,一些非文盲用户(即奶奶)可能不知道如何设置本地系统的时区;或隧道会话或虚拟机上的用户可能具有未根据其实际偏好设置的“本地”时区。

根据您对该客户端的了解(IP等)猜测客户端的政治时区可能是错误的,如果用户无法覆盖猜测,则会非常烦人。但对于匿名用户或新用户注册,我认为使用这种方法作为初始猜测是没有错的,只要你给用户一些方法来改变它,如果它是错误的。

我的建议具体是:

  • 将Olson时区包含在任何用户个人资料中。时区可以按国家查找,这应该使用户选择他们的时区相对无痛。给予关注直接UTC选择的0.01%的用户: - )
  • 如果使用基于IP的猜测填充用户配置文件中的默认值,那么如果您使用良好的查找服务,则大多数情况下都是正确的。但如果错误,请允许用户进行更改。
  • 对于匿名用户,在显示或输入本地时间的任何页面上提供某种小部件,这样他们就可以选择他们的Olson时区,其方式与用户配置文件的方式非常相似。将他们选择的值存储在cookie中。默认为UTC或如上所述的猜测值。

在实现以前需要在本地化时间显示时间戳的基于Web的应用程序时,我发现并非所有客户端都将UTC正确地转换为过去和未来日期的本地时间。我必须在服务器端执行所有转换。这可能需要一个需要本地时间和Olson时区的Web服务,并返回UTC时间。

答案 2 :(得分:0)

您无法从请求标头中可靠地获取用户的时区。这就是大多数网站要求用户在个人资料设置中设置时区的原因。但是,您可以使用各种技巧来尝试获取。一个技巧是使用谷歌的IP到位置API来找出用户来自哪里,然后尝试从地理位置猜测时区。这也不是100%可靠,但会让你更接近事实。

刚刚意识到这已经至少在这里被问过了一次:get user timezone

答案 3 :(得分:0)

我不会做ip地理定位。它可能非常不准确,尤其是免费服务。只需询问用户邮政编码或状态,并将其存储在cookie中。

答案 4 :(得分:0)

您可以使用javascript(知道本地时间),在将数据发送到服务器之前将用户输入的时间更改为UTC。然后,以一种格式发送UTC,以便javascript可以将它从UTC转换为本地时间。

例如,要发送到服务器的UTC日期:

(new Date("November 11, 2011 23:13:42")).toUTCString()

UTC到当地时间,用于渲染:

(new Date("October 17, 1986 15:29:13 UTC")).toLocaleString()