업데이트
우리는 /Date(msecs)/
여기에 원래 질문 된 것과 같은 Microsoft의 ASP.NET 내장 JSON 형식 과 JSON.NET을 포함한 대부분의 JSON 날짜 형식 모두에 대처 해야하는 내부 UI 라이브러리가 있습니다 2014-06-22T00:00:00.0
. 또한 우리는 oldIE의 소수점 이하 자릿수를 처리 할 수없는 능력에 대처해야합니다 .
먼저 어떤 종류의 날짜를 소비하는지 감지하고 일반 JavaScript Date
객체 로 구문 분석 한 다음 형식을 지정합니다.
1) Microsoft 날짜 형식 감지
// 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 날짜 또는 ISO 날짜 나왔습니다 거래 항상 세 밀리 초 장소를 (이 있는지 확인 할 수있는 방법이 우리가 할 위 참조 코드가 환경에 따라 다른 정도).
4a) 표준 ISO 날짜 형식을 분석하고 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) 고정 소수점 3 밀리 초로 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');
},
...
});
jQuery 1.5에서는 parseJSON
Ajax 호출에서 converters 옵션을 사용하여 메소드를 전체적으로 대체하지 않아도 됩니다.
http://api.jquery.com/jQuery.ajax/
불행히도 Dates를 전 세계적으로 구문 분석하려면 구식 평가 경로로 전환해야합니다. 그렇지 않으면 구문 분석 후 더 사례별로 변환해야합니다.