更新
我们有一个内部 UI 库,它必须同时处理 Microsoft 的 ASP.NET 内置 JSON 格式,如/Date(msecs)/
最初在这里询问的,以及大多数 JSON 的日期格式,包括 JSON.NET 的,如2014-06-22T00:00:00.0
. 此外,我们需要解决oldIE 无法处理小数点后 3 位以外的任何问题。
我们首先检测我们正在使用的日期类型,将其解析为普通的 JavaScriptDate
对象,然后将其格式化。
1)检测微软日期格式
// Handling of Microsoft AJAX Dates, formatted like '/Date(01238329348239)/'
function looksLikeMSDate(s) {
return /^\/Date\(/.test(s);
}
2) 检测 ISO 日期格式
var isoDateRegex = /^(\d\d\d\d)-(\d\d)-(\d\d)T(\d\d):(\d\d):(\d\d)(\.\d\d?\d?)?([\+-]\d\d:\d\d|Z)?$/;
function looksLikeIsoDate(s) {
return isoDateRegex.test(s);
}
3)解析MS日期格式:
function parseMSDate(s) {
// Jump forward past the /Date(, parseInt handles the rest
return new Date(parseInt(s.substr(6)));
}
4) 解析 ISO 日期格式。
我们至少有办法确保我们处理的是标准 ISO 日期或修改为始终具有 3 毫秒位置的 ISO 日期(见上文),因此代码因环境而异。
4a) 解析标准ISO Date格式,处理oldIE的问题:
function parseIsoDate(s) {
var m = isoDateRegex.exec(s);
// Is this UTC, offset, or undefined? Treat undefined as UTC.
if (m.length == 7 || // Just the y-m-dTh:m:s, no ms, no tz offset - assume UTC
(m.length > 7 && (
!m[7] || // Array came back length 9 with undefined for 7 and 8
m[7].charAt(0) != '.' || // ms portion, no tz offset, or no ms portion, Z
!m[8] || // ms portion, no tz offset
m[8] == 'Z'))) { // ms portion and Z
// JavaScript's weirdo date handling expects just the months to be 0-based, as in 0-11, not 1-12 - the rest are as you expect in dates.
var d = new Date(Date.UTC(m[1], m[2]-1, m[3], m[4], m[5], m[6]));
} else {
// local
var d = new Date(m[1], m[2]-1, m[3], m[4], m[5], m[6]);
}
return d;
}
4b) 使用固定的三毫秒小数位解析 ISO 格式 - 更容易:
function parseIsoDate(s) {
return new Date(s);
}
5)格式化:
function hasTime(d) {
return !!(d.getUTCHours() || d.getUTCMinutes() || d.getUTCSeconds());
}
function zeroFill(n) {
if ((n + '').length == 1)
return '0' + n;
return n;
}
function formatDate(d) {
if (hasTime(d)) {
var s = (d.getMonth() + 1) + '/' + d.getDate() + '/' + d.getFullYear();
s += ' ' + d.getHours() + ':' + zeroFill(d.getMinutes()) + ':' + zeroFill(d.getSeconds());
} else {
var s = (d.getMonth() + 1) + '/' + d.getDate() + '/' + d.getFullYear();
}
return s;
}
6)把它们绑在一起:
function parseDate(s) {
var d;
if (looksLikeMSDate(s))
d = parseMSDate(s);
else if (looksLikeIsoDate(s))
d = parseIsoDate(s);
else
return null;
return formatDate(d);
}
下面的旧答案对于将此日期格式绑定到 jQuery 自己的 JSON 解析中很有用,这样您就可以获得 Date 对象而不是字符串,或者如果您仍然以某种方式陷入 jQuery <1.5。
旧答案
如果您在 ASP.NET MVC 中使用 jQuery 1.4 的 Ajax 函数,您可以使用以下命令将所有 DateTime 属性转换为 Date 对象:
// Once
jQuery.parseJSON = function(d) {return eval('(' + d + ')');};
$.ajax({
...
dataFilter: function(d) {
return d.replace(/"\\\/(Date\(-?\d+\))\\\/"/g, 'new $1');
},
...
});
parseJSON
在 jQuery 1.5 中,您可以通过在 Ajax 调用中使用转换器选项来避免全局覆盖该方法。
http://api.jquery.com/jQuery.ajax/
不幸的是,您必须切换到较旧的 eval 路线才能让 Dates 就地全局解析 - 否则您需要在解析后更具体地转换它们。