Django Ajax 响应日期和时间格式
Django Ajax response date and time format
遇到问题...
我使用 Django
、SQLite
、jquery
和 AJAX
。
问题是当我从数据库中获取日期和时间时,它看起来很奇怪。
有什么办法可以正常显示,如dd/mm/yyyy HH:MM
?
Modeles.py
class QueryHistory(models.Model) :
userID = models.CharField(max_length=100)
date = models.DateTimeField(auto_now_add=True, blank=True)
View.py
queries_list = serializers.serialize(
'json',
(QueryHistory.objects.filter(
userID = request.session['user_id']
).order_by('-id')[:5])
)
return HttpResponse(json.dumps(queries_list), content_type="application/json")
Js.js
success : function(response) {
var queries_list = jQuery.parseJSON(response);
console.log(response);
}
Result: 2016-09-21T06:43:26.693Z
Should be: 21/09/2016 06:43
这并不奇怪,它是 ISO 8601,更改它不是一个好主意。但是您可以通过定义自己的编码器:
import json
from datetime import dateteime
from django.forms.models import model_to_dict
from django.core.serializers.json import DjangoJSONEncoder
class MyEncoder(DjangoJSONEncoder):
def default(self, obj):
if isinstance(obj, date):
return obj.strftime('%d.%m.%Y')
return super(MyEncoder, self).default(obj)
json.dumps([model_to_dict(o) for o in QueryHistory.objects.all()], cls=MyEncoder)
或者通过你自己的序列化器:
import json
from datetime import dateteime
from django.core.serializers.python import Serializer
class MySerializer(Serializer):
def handle_field(self, obj, field):
value = field.value_from_object(obj)
if isinstance(value, date):
self._current['date'] = value.strftime('%d.%m.%Y')
else:
super(MySerializer, self).handle_field(obj, field)
serializer = MySerializer()
queries_list = serializer.serialize(QueryHistory.objects.all())
json.dumps(queries_list)
我想出了自己的解决方案。
要以您自己的格式显示日期,您只需创建一个变量 new Date
var date = new Date();
之后,我们从对此变量的响应中解析日期,因此将其更改为:
var date = new Date(ourAjaxResponse.date);
现在,如果您尝试显示它,您将获得标准的 JavaScript 日期格式:
Wed Mar 25 2015 13:00:00 GMT+1300 (New Zealand ())
多亏了 JavaScript,它有几个方法可以让我们获取小时、分钟以及我们需要显示日期的所有其他内容。
var date = new Date(ourAjaxResponse.date);
var day = date.getDate();
var mnth = date.getMonth();
var year = date.getFullYear();
var hrs = date.getHours();
var mnts = date.getMinutes();
var mnths
将是从 1 到 12 的数字,因此您可以用您自己的语言创建一个包含月份列表的数组
var monthNames = [
"Января", "Февраля", "Марта",
"Апреля", "Мая", "Июня", "Июля",
"Августа", "Сентября", "Октября",
"Ноября", "Декабря"
]; // For Example: in Russian
var monthNames = [
"January", "February", "March",
"April", "May", "June", "July",
"August", "September", "October",
"November", "December"
]; //or in English
最终结果:
我有获取日期变量的函数:
function get_date(date){
var date = new Date(date);
var day = date.getDate();
var monthIndex = date.getMonth();
var year = date.getFullYear();
var hours = addZero(date.getHours());//addZero() function described below
var minutes = addZero(date.getMinutes());
return "<i class='fa fa-calendar-o' aria-hidden='true'></i> " + day + " " + monthNames[monthIndex] + " " + year + " <i class='fa fa-clock-o' aria-hidden='true'></i> " + hours + ":" + minutes;
}
另一个在小时和分钟前面加零的小函数,因为如果这些小于10,结果将是
8:21 or 19:8 instead of 08:21 or 19:08
function addZero(i) {
if (i < 10) {
i = "0" + i;
}
return i;
}
现在,您可以在代码中的任何位置调用此函数并从您的服务器或任何其他来源解析日期,您将始终获得相同的结果:
console.log(get_date(ourAjaxResponse.date));
22 September 2016 01:16
如果您在函数 get_date()
中更改 return
on:
return day + "/" + monthIndex + "/" + year + " " + hours + ":" + minutes;
22/09/2016 01:16
遇到问题...
我使用 Django
、SQLite
、jquery
和 AJAX
。
问题是当我从数据库中获取日期和时间时,它看起来很奇怪。
有什么办法可以正常显示,如dd/mm/yyyy HH:MM
?
Modeles.py
class QueryHistory(models.Model) :
userID = models.CharField(max_length=100)
date = models.DateTimeField(auto_now_add=True, blank=True)
View.py
queries_list = serializers.serialize(
'json',
(QueryHistory.objects.filter(
userID = request.session['user_id']
).order_by('-id')[:5])
)
return HttpResponse(json.dumps(queries_list), content_type="application/json")
Js.js
success : function(response) {
var queries_list = jQuery.parseJSON(response);
console.log(response);
}
Result: 2016-09-21T06:43:26.693Z
Should be: 21/09/2016 06:43
这并不奇怪,它是 ISO 8601,更改它不是一个好主意。但是您可以通过定义自己的编码器:
import json
from datetime import dateteime
from django.forms.models import model_to_dict
from django.core.serializers.json import DjangoJSONEncoder
class MyEncoder(DjangoJSONEncoder):
def default(self, obj):
if isinstance(obj, date):
return obj.strftime('%d.%m.%Y')
return super(MyEncoder, self).default(obj)
json.dumps([model_to_dict(o) for o in QueryHistory.objects.all()], cls=MyEncoder)
或者通过你自己的序列化器:
import json
from datetime import dateteime
from django.core.serializers.python import Serializer
class MySerializer(Serializer):
def handle_field(self, obj, field):
value = field.value_from_object(obj)
if isinstance(value, date):
self._current['date'] = value.strftime('%d.%m.%Y')
else:
super(MySerializer, self).handle_field(obj, field)
serializer = MySerializer()
queries_list = serializer.serialize(QueryHistory.objects.all())
json.dumps(queries_list)
我想出了自己的解决方案。
要以您自己的格式显示日期,您只需创建一个变量 new Date
var date = new Date();
之后,我们从对此变量的响应中解析日期,因此将其更改为:
var date = new Date(ourAjaxResponse.date);
现在,如果您尝试显示它,您将获得标准的 JavaScript 日期格式:
Wed Mar 25 2015 13:00:00 GMT+1300 (New Zealand ())
多亏了 JavaScript,它有几个方法可以让我们获取小时、分钟以及我们需要显示日期的所有其他内容。
var date = new Date(ourAjaxResponse.date);
var day = date.getDate();
var mnth = date.getMonth();
var year = date.getFullYear();
var hrs = date.getHours();
var mnts = date.getMinutes();
var mnths
将是从 1 到 12 的数字,因此您可以用您自己的语言创建一个包含月份列表的数组
var monthNames = [
"Января", "Февраля", "Марта",
"Апреля", "Мая", "Июня", "Июля",
"Августа", "Сентября", "Октября",
"Ноября", "Декабря"
]; // For Example: in Russian
var monthNames = [
"January", "February", "March",
"April", "May", "June", "July",
"August", "September", "October",
"November", "December"
]; //or in English
最终结果:
我有获取日期变量的函数:
function get_date(date){
var date = new Date(date);
var day = date.getDate();
var monthIndex = date.getMonth();
var year = date.getFullYear();
var hours = addZero(date.getHours());//addZero() function described below
var minutes = addZero(date.getMinutes());
return "<i class='fa fa-calendar-o' aria-hidden='true'></i> " + day + " " + monthNames[monthIndex] + " " + year + " <i class='fa fa-clock-o' aria-hidden='true'></i> " + hours + ":" + minutes;
}
另一个在小时和分钟前面加零的小函数,因为如果这些小于10,结果将是
8:21 or 19:8 instead of 08:21 or 19:08
function addZero(i) {
if (i < 10) {
i = "0" + i;
}
return i;
}
现在,您可以在代码中的任何位置调用此函数并从您的服务器或任何其他来源解析日期,您将始终获得相同的结果:
console.log(get_date(ourAjaxResponse.date));
22 September 2016 01:16
如果您在函数 get_date()
中更改 return
on:
return day + "/" + monthIndex + "/" + year + " " + hours + ":" + minutes;
22/09/2016 01:16