Aktualisiert
Wir haben eine interne UI-Bibliothek, die sowohl mit dem in ASP.NET integrierten JSON-Format von Microsoft als auch mit den folgenden Formaten zurechtkommen muss /Date(msecs)/
und die meisten JSON-Datumsformate, einschließlich der von JSON.NET, wie 2014-06-22T00:00:00.0
. Darüber hinaus müssen wir mit folgenden Problemen fertig werden die Unfähigkeit von oldIE, mit etwas anderem als 3 Dezimalstellen umzugehen .
Zuerst erkennen wir die Art des Datums, das wir verbrauchen, und parsen es in ein normales JavaScript Date
Objekt, und formatieren Sie es dann aus.
1) Microsoft Datumsformat erkennen
// Handling of Microsoft AJAX Dates, formatted like '/Date(01238329348239)/'
function looksLikeMSDate(s) {
return /^\/Date\(/.test(s);
}
2) ISO-Datumsformat erkennen
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) Parsen des MS-Datumsformats:
function parseMSDate(s) {
// Jump forward past the /Date(, parseInt handles the rest
return new Date(parseInt(s.substr(6)));
}
4) Parsen des ISO-Datumsformats.
So können wir wenigstens sicher sein, dass es sich um ISO-Standarddaten oder um ISO-Daten handelt, die so modifiziert wurden, dass sie immer drei Millisekunden haben ( siehe oben ), so dass der Code je nach Umgebung unterschiedlich ist.
4a) Parsen des Standard-ISO-Datumsformats, Bewältigung von OldIE-Problemen:
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) Parsen des ISO-Formats mit drei festen Dezimalstellen im Millisekundenbereich - viel einfacher:
function parseIsoDate(s) {
return new Date(s);
}
5) Formatieren Sie es:
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) Binden Sie alles zusammen:
function parseDate(s) {
var d;
if (looksLikeMSDate(s))
d = parseMSDate(s);
else if (looksLikeIsoDate(s))
d = parseIsoDate(s);
else
return null;
return formatDate(d);
}
Die unten alte Antwort ist nützlich für die Bindung dieses Datum Formatierung in jQuery eigenen JSON-Parsing, so dass Sie Datum Objekte anstelle von Zeichenfolgen erhalten, oder wenn Sie noch in jQuery <1.5 irgendwie stecken.
Alte Antwort
Wenn Sie die Ajax-Funktion von jQuery 1.4 mit ASP.NET MVC verwenden, können Sie alle DateTime-Eigenschaften mit in Date-Objekte umwandeln:
// Once
jQuery.parseJSON = function(d) {return eval('(' + d + ')');};
$.ajax({
...
dataFilter: function(d) {
return d.replace(/"\\\/(Date\(-?\d+\))\\\/"/g, 'new $1');
},
...
});
In jQuery 1.5 können Sie das Überschreiben der parseJSON
Methode global, indem Sie die Option Konverter im Ajax-Aufruf verwenden.
http://api.jquery.com/jQuery.ajax/
Leider müssen Sie auf die ältere eval-Route wechseln, um Dates global in-place zu parsen - ansonsten müssen Sie sie von Fall zu Fall nach dem Parsen konvertieren.
27 Stimmen
Das könnte interessant sein: hanselman.com/blog/
10 Stimmen
Das Format /Date(...)/ ist spezifisch für Microsofts eingebautes JSON-Datumsformat - es ist nicht Teil eines Standards, und JSON, das von Javascript kommt, hat einen Standard: Das ISO-Format, das Javascript spezifiziert: stackoverflow.com/a/15952652/176877 Diese Frage bezieht sich also auf das JSON-Date-Format von Microsoft. Ich habe den Titel geändert, um dies zu verdeutlichen.
19 Stimmen
Das ist ein Scherz! Microsoft hat JSON seinen eigenen Stempel aufgedrückt! und auf Daten!! Wann lernen sie es endlich!
1 Stimmen
Verwenden Sie Newtonsoft JSON auf der .NET Seite und um schöne typisierte Werte auf der JS Seite zu haben, verwenden Sie einfach: github.com/RickStrahl/json.date-extensions
0 Stimmen
Sie können JSON++ anstelle von JSON verwenden. JSON++ ist dasselbe wie JSON, aber mit Unterstützung für JavaScript-Typen wie
Date
.0 Stimmen
Hinweis: Das offizielle Datumsformat bei der Verwendung von Json oder XML ist "yyyy-MM-dd", versuchen Sie, dieses Format zu verwenden, wo immer Sie die API schreiben oder sie konsumieren.