【问题标题】:Converting UTC datetime to user's local date and time将 UTC 日期时间转换为用户的本地日期和时间
【发布时间】:2011-05-06 03:28:09
【问题描述】:

我在 Django 和 Google App Engine 上使用 python。我还在我的一个模型中使用 DateTimeProperty。有时我想向用户显示该日期和时间。

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

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

【问题讨论】:

标签: python django google-app-engine localization


【解决方案1】:

这更像是一个 Python 问题,而不是 GAE 问题,除非 GAE 有一些基础设施来促进这一点(我已经进行了快速扫描,但没有找到任何参考资料)。

基本上,您希望将日期/时间与用户时区一起存储在 UTC 时区(例如使用 datetime.datetime.utcnow)中,您可以尝试从用户 IP 中提取(使用 GeoDjango,如果在 GAE 上可用,或 pygeoip ; 您需要一些地理定位数据库,例如:http://www.maxmind.com/app/geolitecity),或者明确地询问用户 - 这样做的好处是您可以要求一个描述性的时区名称,例如“欧洲/华沙”。如果您只要求 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 中有效,但至少您会知道要寻找什么)

【讨论】:

  • 这比我想象的要复杂。明确询问用户是不可能的。 GeoDjango 看起来像是一个包含各种 GEO 相关内容的大型库,我只想将 IP 地址转换为时区。就连 pytz 看起来都很大。
【解决方案2】:

所以我对此进行了更多研究。要正确设置时区,您必须遵循 Tomasz 在他的回答中描述的内容。但是,如果您愿意忍受一点杂碎,您可以轻松完成 90% 的任务。

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

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

当然,这假设用户已正确设置其当前时区。这在许多其他网站上都有讨论:

【讨论】:

  • 啊,很好,我不知道这个。不过,如果你开发例如CRM,那么您就不能忽视 DST 等微妙之处。
【解决方案3】:

在模板中转换 Google App Engine 日期时间的最佳简便方法:

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

【讨论】:

    猜你喜欢
    • 2012-10-07
    • 1970-01-01
    • 1970-01-01
    • 2022-11-14
    • 2018-07-15
    • 1970-01-01
    • 2016-07-29
    • 2019-06-21
    • 2011-06-13
    相关资源
    最近更新 更多