我在Django和Google App Engine上使用python。我也在我的一个模型中使用DateTimeProperty。偶尔我想向用户显示该日期和时间。
将DateTimeProperty中存储的日期时间转换为用户日期时间的最佳方法是什么?
或者更精确地构建问题的方法:获取客户端时区并将python日期时间对象转换为自己的本地时间的最佳方法是什么?
答案 0 :(得分:8)
这是一个Python问题,而不是GAE问题,除非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是提到的“Europe / Warsaw”。
(请注意,我不知道哪些在GAE中有效,但至少你会知道要寻找什么)
答案 1 :(得分:3)
所以我对此做了一些研究。要正确地做时区,你必须遵循Tomasz在他的回答中描述的内容。但是,如果你愿意容忍一点点克服,你可以用更少的努力获得90%的成功。
当用户登录或对您的网站执行任何操作时,您可以使用javascript获取其当前时区偏移量,然后在下一个请求中发送:
var offset = (new Date()).getTimezoneOffset()
$.post("post.html", "offset="offset.toString(), ... );
当然,这假设用户已正确设置其当前时区。这在许多其他网站上进行了讨论:
答案 2 :(得分:0)
在模板中转换Google App Engine日期时间的最佳方式: