我正在使用jQuery在Ajax上进行首次尝试。 我正在将数据存储到页面上,但是为Date数据类型返回的JSON数据遇到了一些麻烦。 基本上,我得到的字符串看起来像这样:
/Date(1224043200000)/
从完全不熟悉JSON的人-如何将其格式化为短日期格式? 是否应该在jQuery代码中的某个地方处理? 我已经尝试使用$.datepicker.formatDate()
尝试使用jQuery.UI.datepicker
插件,但没有成功。
仅供参考:这是我结合以下答案使用的解决方案:
function getMismatch(id) {
$.getJSON("Main.aspx?Callback=GetMismatch",
{ MismatchId: id },
function (result) {
$("#AuthMerchId").text(result.AuthorizationMerchantId);
$("#SttlMerchId").text(result.SettlementMerchantId);
$("#CreateDate").text(formatJSONDate(Date(result.AppendDts)));
$("#ExpireDate").text(formatJSONDate(Date(result.ExpiresDts)));
$("#LastUpdate").text(formatJSONDate(Date(result.LastUpdateDts)));
$("#LastUpdatedBy").text(result.LastUpdateNt);
$("#ProcessIn").text(result.ProcessIn);
}
);
return false;
}
function formatJSONDate(jsonDate) {
var newDate = dateFormat(jsonDate, "mm/dd/yyyy");
return newDate;
}
该解决方案从回调方法中获取了我的对象,并使用日期格式库在页面上正确显示了日期。
#1楼
仅在此处添加另一种方法,如果您不十分小心(如此处和其他地方所述), WCF采取的“滴答方法”就容易出现时区问题。 因此,我现在使用的是.NET和JavaScript都适当支持的ISO 8601格式,其中包括时区偏移量。 以下是详细信息:
在WCF / .NET中:
其中CreationDate是System.DateTime; ToString(“ o”)使用.NET的往返格式说明符 ,该说明符生成符合ISO 8601的日期字符串
new MyInfo {
CreationDate = r.CreationDate.ToString("o"),
};
在JavaScript中
检索JSON之后,我就使用Date构造函数将日期固定为JavaSript Date对象,该构造函数接受ISO 8601日期字符串...
$.getJSON(
"MyRestService.svc/myinfo",
function (data) {
$.each(data.myinfos, function (r) {
this.CreatedOn = new Date(this.CreationDate);
});
// Now each myinfo object in the myinfos collection has a CreatedOn field that is a real JavaScript date (with timezone intact).
alert(data.myinfos[0].CreationDate.toLocaleString());
}
)
获得JavaScript日期后,就可以使用所有方便且可靠的Date方法,例如toDateString , toLocaleString等。
#2楼
在页面中添加jQuery UI插件:
function DateFormate(dateConvert) {
return $.datepicker.formatDate("dd/MM/yyyy", eval('new ' + dateConvert.slice(1, -1)));
};
#3楼
以下是解析JSON日期的非常简单的解决方案。 根据需要使用以下功能。 您只需要将获取的JSON格式Date作为参数传递给以下函数:
function JSONDate(dateStr) {
var m, day;
jsonDate = dateStr;
var d = new Date(parseInt(jsonDate.substr(6)));
m = d.getMonth() + 1;
if (m < 10)
m = '0' + m
if (d.getDate() < 10)
day = '0' + d.getDate()
else
day = d.getDate();
return (m + '/' + day + '/' + d.getFullYear())
}
function JSONDateWithTime(dateStr) {
jsonDate = dateStr;
var d = new Date(parseInt(jsonDate.substr(6)));
var m, day;
m = d.getMonth() + 1;
if (m < 10)
m = '0' + m
if (d.getDate() < 10)
day = '0' + d.getDate()
else
day = d.getDate();
var formattedDate = m + "/" + day + "/" + d.getFullYear();
var hours = (d.getHours() < 10) ? "0" + d.getHours() : d.getHours();
var minutes = (d.getMinutes() < 10) ? "0" + d.getMinutes() : d.getMinutes();
var formattedTime = hours + ":" + minutes + ":" + d.getSeconds();
formattedDate = formattedDate + " " + formattedTime;
return formattedDate;
}
#4楼
var newDate = dateFormat(jsonDate, "mm/dd/yyyy");
有没有不使用jQuery库的另一种选择?
#5楼
我最终在Panos的正则表达式中添加了“字符”,以消除将对象写入内联脚本时Microsoft序列化程序生成的那些字符:
因此,如果您在C# 代码中有一个属性,则类似于
protected string JsonObject { get { return jsSerialiser.Serialize(_myObject); }}
在你的aspx中
<script type="text/javascript">
var myObject = '<%= JsonObject %>';
</script>
你会得到像
var myObject = '{"StartDate":"\/Date(1255131630400)\/"}';
注意双引号。
为了使它成为eval可以正确反序列化的形式,我使用了:
myObject = myObject.replace(/"\/Date\((\d+)\)\/"/g, 'new Date($1)');
我使用原型,并使用我添加的
String.prototype.evalJSONWithDates = function() {
var jsonWithDates = this.replace(/"\/Date\((\d+)\)\/"/g, 'new Date($1)');
return jsonWithDates.evalJSON(true);
}