jquery ajax应该如何格式化日期?

时间:2016-02-02 13:51:30

标签: jquery json ajax date

我使用jquery与REST API进行通信。 (ASP.net Web API)。

我创建了一个简单的对象,然后使用jquery在服务器上“PUT”它:

var myObject = {
  name: 'just a name',
  createDate: new Date()
}
$.ajax({
  url: 'https://myServer/api/person/1',
  dataType: 'json',
  method: 'put',
  data: myObject
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

查看Firebug中的网络流量,我可以看到我的createDate propery通过以下方式发送:

Tue Feb 02 2016 14:40:26 GMT+0100 (W. Europe Standard Time)

这将是new Date().toString()

的默认呈现

我的API不喜欢这样,它接受多种格式的日期,并且能够很好地处理正常的JSON版本:

new Date().toJSON()
results to: "2016-02-02T13:45:37.069Z"

如何处理?我宁愿不必通过“手动”将每个日期转换为JSON来发布我的对象,这样就可以轻松地处理复杂对象。

我能做什么(警告真的很脏的技巧),覆盖日期对象的默认toString方法:

Date.prototype.toString = new Date().toJSON

这有效......但是......你好!

有什么想法?

2 个答案:

答案 0 :(得分:2)

JSON.stringify采用“replacer”参数,可以是几个东西,包括可用于为属性生成适当值的函数。您可以使用它来替换服务器随后将检测到的格式并转回日期。

示例:

var data = {
  dt: new Date()
};
document.body.innerHTML = JSON.stringify(data, function(key, value) {
  if (value instanceof Date) {
    return value.toISOString();
  }
  return value;
});

或者是Microsoft的首选/Date(mssinceepoch)/

document.body.innerHTML = JSON.stringify(data, function(key, value) {
  if (value instanceof Date) {
    return "/Date(" + value.getTime() + ")/";
  }
  return value;
});

无论哪种方式,您的服务器部分都必须检测那些(通过密钥的名称,或通过值的模式等)并将它们转换回日期。

您的ajax来电将更改为:

var myObject = {
  name: 'just a name',
  createDate: new Date()
};
$.ajax({
  url: 'https://myServer/api/person/1',
  contentType: 'json',
  method: 'put',
  data: JSON.stringify(myObject, myReplacerFunction)
});

唯一的区别是致电JSON.stringify。此外,您已将dataType: 'json'置于通话中,但如果您发送 JSON,则使用contentType告诉服务器它是什么,而不是dataType ; dataType告诉jQuery你希望服务器发送回来

答案 1 :(得分:0)

所以,感谢T.J。的回答和一些进一步的探索,这就是我想出来的,有人可能会觉得它很有用。

目标:发布一个包含日期的对象,将它们作为JSON通过该行发送。锦上添花:使用LOCALIZED日期对象而不是UTC日期,因为我碰巧喜欢它;)

&#13;
&#13;
/* 
	add a toJSONlocal method to the date object
	takes the date, corrects the time zone and gives json output without the 'Z' at the end 
*/
Date.prototype.toJSONlocal = function() {
	var local = new Date(this); 
	local.setMinutes(this.getMinutes() - this.getTimezoneOffset());
	return local.toJSON().substring(0,23)
}

/* 
	replacer function to use with JSON.stringify() 
	checks if the received string is an ISO Date, if so make it local.
*/
jsonDateLocalizer = function(key, value) {
	if(typeof value == 'string' && value.match(/\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z/)) {
		return(new Date(value).toJSONlocal())
	}
	return value;
};



var myObject = {
  name: 'Bobby Tables',
  createDate: new Date()
}
$.ajax({
	url: 'https://myServer/api/person/1', // send it here
	dataType: 'json', // expect json in return
	method: 'put', // let's do a PUT request
	contentType:"application/json; charset=utf-8", //tell the server I'm sending json.
	data: JSON.stringify(myObject, jsonDateLocalizer) // here you go, json data, with dates the way I like 'em
})
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
&#13;
&#13;
&#13;