date_format Django 1.4 具有正确的时区



好的简单问题(我认为)。

我有一个日期时间字段 (auto_add_now) 以及何时输出到模板

{{ edited|date:"DATETIME_FORMAT" }}

我得到"2012 年 9 月 16 日下午 12:01"的预期结果

但不幸的是,事情稍微复杂一些,因为我使用的是 Backbone.js并且需要使用 JSON 传递日期时间,并且由于它仅用于显示目的,我决定将其作为不错的语言环境格式字符串传递。所以我深入研究了代码并找到了模板标签使用的内容,这就是我设置的内容。

from django.utils.formats import date_format
return {
    'created': date_format(self.created, 'DATETIME_FORMAT'),
}

但最终的结果是"2012年9月16日下午5:01"。

我有一种感觉,这与模板标签上的以下内容有关

@register.filter(expects_localtime=True, is_safe=False)

我也试过这个,但最终得到了相同的结果

from django.utils import timezone
tz = timezone.get_current_timezone()
logger.info(tz)
logger.info(self.edited)
logger.info(format(self.edited, 'DATETIME_FORMAT'))
logger.info(self.edited.replace(tzinfo=tz))
logger.info(format(self.edited.replace(tzinfo=tz), 'DATETIME_FORMAT'))

这给了我这个

INFO: America/Chicago
INFO: 2012-09-16 17:01:52.921276+00:00
INFO: Sept. 16, 2012, 5:01 p.m.
INFO: 2012-09-16 17:01:52.921276-06:00
INFO: Sept. 16, 2012, 5:01 p.m.

所以,是的,我一定错过了一些东西,我一直在 django 文档中上下下,找不到任何可以指出我做错了什么的东西。感谢您的任何帮助。

我想通了。可悲的是,在Django时区文档中,我认为我已经筋疲力尽了。本地化使用时区.localtime()

from django.utils.formats import date_format
from django.utils import timezone
date_format(timezone.localtime(page.created), 'DATETIME_FORMAT')

也许以下内容会对您有所帮助。

>>> obj = MyModel.objects.get(...)
>>> data = {"date_format": obj.edited}
>>> from django.core.serializers.json import DjangoJSONEncoder
>>> data = json.dumps(data, cls=DjangoJSONEncoder)
>>> data
'{"date_format": "2012-09-16T21:45:46Z"}'

从视图中发送 json 格式的数据:

E.g return HttpResponse(data, mimetype='application/json').      

然后在客户端代码中,您可以使用以下命令将date_format转换为本地时区:(假设response是 JSON 解析的对象)

var d = new Date(Date.parse(response.date_format));
// Sun Sep 16 2012 22:45:46 GMT+0100 (BST)

最新更新