更新しました
/Date(msecs)/
Microsoft の ASP.NET 組み込み JSON 形式 (ここで最初に質問されたなど) と、JSON.NET を含むほとんどの JSON の日付形式 ( など) の両方に対応する必要がある内部 UI ライブラリがあります2014-06-22T00:00:00.0
。さらに、oldIE では小数点以下 3 桁以外を処理できないことに対処する必要があります。
まず、使用している日付の種類を検出し、それを解析して通常の JavaScriptDate
オブジェクトに変換し、それをフォーマットします。
1) Microsoft Date 形式を検出する
// 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 日付形式を解析し、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');
},
...
});
parseJSON
jQuery 1.5では、Ajax 呼び出しでコンバーター オプションを使用することにより、メソッドをグローバルにオーバーライドすることを回避できます。
http://api.jquery.com/jQuery.ajax/
残念ながら、日付をその場でグローバルに解析するには、古い eval ルートに切り替える必要があります。それ以外の場合は、解析後にケースバイケースで変換する必要があります。