2162 Stimmen

Wie formatiere ich ein Microsoft JSON-Datum?

Ich versuche mich zum ersten Mal an Ajax mit jQuery. Ich bin immer meine Daten auf meine Seite, aber ich habe einige Probleme mit den JSON-Daten, die für Datum Datentypen zurückgegeben wird. Im Grunde bekomme ich eine Zeichenfolge zurück, die wie folgt aussieht:

/Date(1224043200000)/

Von jemandem völlig neu zu JSON - Wie formatiere ich dies zu einem kurzen Datum Format? Sollte dies irgendwo in der jQuery-Code behandelt werden? Ich habe versucht, die jQuery.UI.datepicker Plugin mit $.datepicker.formatDate() ohne jeden Erfolg.

Zu Ihrer Information: Hier ist die Lösung, die ich mit einer Kombination aus den Antworten hier gefunden habe:

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;
}

Diese Lösung erhielt mein Objekt von der Callback-Methode und zeigte die Daten auf der Seite richtig mit der Datumsformat-Bibliothek.

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!

62voto

John Boker Punkte 80493

Wenn Sie in JavaScript sagen,

var thedate = new Date(1224043200000);
alert(thedate);

sehen Sie, dass es sich um das richtige Datum handelt, und Sie können es überall im JavaScript-Code mit jedem Framework verwenden.

3 Stimmen

Das hätte ich auch gedacht, außer dass es am Ende so aussieht: var thedate = /Date(1224043200000)/; zumindest bei mir...

2 Stimmen

Date() und Date(1224043200000) liefern sowohl in Chrome als auch in Firefox das gleiche Ergebnis. Ich bin mir nicht sicher, ob dies in alten Browsern funktioniert hat, aber diese Antwort funktioniert in aktuellen Browsern nicht.

0 Stimmen

@James, Ja, der Browser zeigt das aktuelle Datum an :(

61voto

Klicken Sie hier, um die Demo zu sehen

JavaScript/jQuery

var = MyDate_String_Value = "/Date(1224043200000)/"
var value = new Date
            (
                 parseInt(MyDate_String_Value.replace(/(^.*\()|([+-].*$)/g, ''))
            );
var dat = value.getMonth() +
                         1 +
                       "/" +
           value.getDate() +
                       "/" +
       value.getFullYear();

Ergebnis - "10/15/2008"

0 Stimmen

Nur eine Verbesserung der obigen Methode. function formatearFecha(fec) { var value = new Date ( parseInt(fec.replace(/(^.*()|([+-].*$)/g, '')) ); var mes = value.getMonth(); var dia = value.getDate(); var date = dia + "/" + mes + "/" + value. getFullYear(); if (dia < 10) date = date.substr(0, 0) + '0' + dia + date.substr(1); if (mes < 10) date = date.substr(0, 3) + '0' + mes + date.substr(4); return date; } date formatiert zu ddMMyyyy. Prost!

38voto

Chris Moschini Punkte 34996

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.

30voto

johnstok Punkte 91302

Es gibt keinen eingebauten Datumstyp in JSON . Dies sieht aus wie die Anzahl der Sekunden / Millisekunden von einer bestimmten Epoche. Wenn Sie die Epoche kennen, können Sie das Datum erstellen, indem Sie die richtige Zeitspanne hinzufügen.

0 Stimmen

Das ist nicht korrekt, JSON verwendet Javascript Daten, mit zusätzlichen Zeitzone Informationen - die Epoche ist die gleiche wie die Javascript Date-Klasse Epoche (aus offensichtlichen Gründen).

3 Stimmen

@BrainSlug83 - diese Antwort enthält eine Referenz für die Behauptung, dass JSON keinen eingebauten Datumstyp hat. Wenn Sie anderer Meinung sind, geben Sie bitte eine alternative Referenz an. (Sie denken nicht an ein bestimmtes Framework, das sich für ein String-Format zur Darstellung von Daten entschieden hat, oder? Das ist nicht Teil des JSON-Standards und kann es auch nicht sein, denn dann wäre es unmöglich, eine Zeichenkette einzubinden, die nicht als Datum aufgefasst werden soll, aber zufällig eine Reihe von Zeichen enthält, die dem Datumsmuster entsprechen).

29voto

Venemo Punkte 17747

Ich musste auch nach einer Lösung für dieses Problem suchen und stieß schließlich auf moment.js, eine nette Bibliothek, die dieses und viele andere Datumsformate analysieren kann.

var d = moment(yourdatestring)

Das hat mir einige Kopfschmerzen erspart, also dachte ich, ich teile es mit Ihnen :)
Weitere Informationen dazu finden Sie hier: http://momentjs.com/

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X