Ich mache meinen ersten Crack bei Ajax mit jQuery. Ich erhalte meine Daten auf meine Seite, habe jedoch Probleme mit den JSON-Daten, die für Datumsdatentypen zurückgegeben werden. Grundsätzlich bekomme ich eine Zeichenfolge zurück, die so aussieht:
/Date(1224043200000)/
Von jemandem, der für JSON völlig neu ist - Wie formatiere ich dies auf ein kurzes Datumsformat? Sollte dies irgendwo im jQuery-Code behandelt werden? Ich habe das jQuery.UI.datepicker
Plugin $.datepicker.formatDate()
ohne Erfolg ausprobiert .
Zu Ihrer Information: Hier ist die Lösung, die ich mit einer Kombination der 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 hat mein Objekt von der Rückrufmethode abgerufen und die Daten auf der Seite mithilfe der Datumsformatbibliothek korrekt angezeigt.
Date
.Antworten:
eval()
ist nicht nötig. Dies wird gut funktionieren:Die
substr()
Funktion nimmt den/Date(
Teil heraus und dieparseInt()
Funktion erhält die Ganzzahl und ignoriert die)/
am Ende. Die resultierende Nummer wird an denDate
Konstruktor übergeben.Ich habe den Radix absichtlich weggelassen (das 2. Argument dazu
parseInt
); siehe meinen Kommentar unten .Außerdem stimme ich Rorys Kommentar voll und ganz zu : ISO-8601-Daten werden diesem alten Format vorgezogen - daher sollte dieses Format im Allgemeinen nicht für Neuentwicklungen verwendet werden. In der hervorragenden Json.NET- Bibliothek finden Sie eine großartige Alternative zum Serialisieren von Datumsangaben im ISO-8601-Format.
Übergeben Sie für ISO-8601-formatierte JSON-Daten einfach die Zeichenfolge an den
Date
Konstruktor:quelle
Sie können dies verwenden, um ein Datum von JSON zu erhalten:
Anschließend können Sie ein JavaScript- Skript für das Datumsformat (1,2 KB beim Minimieren und Komprimieren) verwenden, um es nach Ihren Wünschen anzuzeigen.
quelle
jsonDate = new Date(+jsonDate.replace(/\/Date\((\d+)\)\//, '$1'));
new Function
ist fast so schlimm wieeval
: dev.opera.com/articles/view/efficient-javascript/…Informationen zur Verwendung von Newtonsoft Json.NET finden Sie unter Native JSON in IE8, Firefox 3.5 und Json.NET .
Auch die Dokumentation zum Ändern des Datumsformats von Json.NET ist hilfreich: Serialisieren von Daten mit Json.NET
Für diejenigen, die zu faul sind, hier sind die schnellen Schritte. Da JSON eine lose DateTime-Implementierung hat, müssen Sie die verwenden
IsoDateTimeConverter()
. Beachten Sie, dass seit Json.NET 4.5 das Standard-Datumsformat ISO ist, sodass der folgende Code nicht benötigt wird.Der JSON wird als durchkommen
Zum Schluss noch etwas JavaScript, um das ISO-Datum in ein JavaScript-Datum umzuwandeln:
Ich habe es so benutzt
quelle
new Date("2009-04-12T20:44:55")
+a[1]
etc repräsentiert die Array-Teile des regulären Ausdrucks und das+
würde es auf eine Zahl umwandeln , also+a[1]
gleich2009
usw. Hier ist die Array-Aufschlüsselung:0: "2009-04-12T20:44:55" 1: "2009" 2: "04" 3: "12" 4: "20" 5: "44" 6: "55"
Das ursprüngliche Beispiel:
spiegelt nicht die Formatierung wider, die WCF beim Senden von Daten über WCF REST mithilfe der integrierten JSON-Serialisierung verwendet. (zumindest unter .NET 3.5, SP1)
Ich fand die Antwort hier hilfreich, aber eine geringfügige Änderung des regulären Ausdrucks ist erforderlich, da anscheinend der GMT-Versatz der Zeitzone an die in WCF JSON zurückgegebene Nummer (seit 1970) angehängt wird.
In einem WCF-Dienst habe ich:
ApptVisitLinkInfo wird einfach definiert:
Wenn "Field2" vom Dienst als Json zurückgegeben wird, lautet der Wert:
Beachten Sie den Zeitzonenversatz, der als Teil des Werts enthalten ist.
Der modifizierte reguläre Ausdruck:
Es ist etwas eifriger und packt alles zwischen den Eltern, nicht nur die erste Nummer. Die resultierende Zeitsinze 1970 plus Zeitzonenversatz kann alle in die Auswertung eingespeist werden, um ein Datumsobjekt zu erhalten.
Die resultierende JavaScript-Zeile für das Ersetzen lautet:
quelle
Wiederholen Sie sich nicht - automatisieren Sie die Datumskonvertierung mit
$.parseJSON()
Antworten auf Ihren Beitrag bieten eine manuelle Datumskonvertierung in JavaScript-Datumsangaben. Ich habe jQuery's
$.parseJSON()
nur ein wenig erweitert, damit es Daten automatisch analysieren kann, wenn Sie es anweisen. Es verarbeitet ASP.NET-formatierte Datumsangaben (/Date(12348721342)/
) sowie ISO-formatierte Datumsangaben (2010-01-01T12.34.56.789Z
), die von nativen JSON-Funktionen in Browsern (und Bibliotheken wie json2.js) unterstützt werden.Wie auch immer. Wenn Sie Ihren Datumskonvertierungscode nicht immer wieder wiederholen möchten, empfehlen wir Ihnen, diesen Blog-Beitrag zu lesen und den Code zu erhalten, der Ihnen das Leben ein wenig erleichtert.
quelle
Wenn Sie in JavaScript sagen,
Sie werden sehen, dass es das richtige Datum ist, und Sie können das überall im JavaScript-Code mit jedem Framework verwenden.
quelle
Klicken Sie hier, um die Demo zu überprüfen
JavaScript / jQuery
Ergebnis - "15.10.2008"
quelle
Aktualisiert
Wir haben eine interne UI-Bibliothek, die sowohl mit dem in Microsoft
/Date(msecs)/
ursprünglich nach ASP.NET integrierten JSON-Format, wie hier ursprünglich gefragt, als auch mit dem Datumsformat der meisten JSONs, einschließlich JSON.NET, wie z2014-06-22T00:00:00.0
. Außerdem müssen wir mit der Unfähigkeit von oldIE fertig werden, mit etwas anderem als 3 Dezimalstellen fertig zu werden .Wir erkennen zuerst, welche Art von Datum wir verbrauchen, analysieren es in ein normales JavaScript-
Date
Objekt und formatieren es dann aus.1) Ermitteln Sie das Microsoft-Datumsformat
2) Ermitteln Sie das ISO-Datumsformat
3) Analysieren Sie das MS-Datumsformat:
4) Analysieren Sie das ISO-Datumsformat.
Wir können zumindest sicherstellen, dass es sich um Standard-ISO-Daten oder ISO-Daten handelt, die so geändert wurden, dass sie immer drei Millisekunden-Stellen haben ( siehe oben ), sodass der Code je nach Umgebung unterschiedlich ist.
4a) Analysieren Sie das Standard-ISO-Datumsformat und bewältigen Sie die Probleme von oldIE:
4b) Analysieren Sie das ISO-Format mit einer festen Dezimalstelle von drei Millisekunden - viel einfacher:
5) Formatieren Sie es:
6) Binde alles zusammen:
Die folgende alte Antwort ist nützlich, um diese Datumsformatierung in die JSON-Analyse von jQuery einzubinden, damit Sie Datumsobjekte anstelle von Zeichenfolgen erhalten oder wenn Sie immer noch in jQuery <1.5 stecken.
Alte Antwort
Wenn Sie die Ajax-Funktion von jQuery 1.4 mit ASP.NET MVC verwenden, können Sie alle DateTime-Eigenschaften in Date-Objekte umwandeln mit:
In jQuery 1.5 können Sie das
parseJSON
globale Überschreiben der Methode vermeiden, indem Sie die Konverteroption im Ajax-Aufruf verwenden.http://api.jquery.com/jQuery.ajax/
Leider müssen Sie zur älteren Bewertungsroute wechseln, damit Dates global an Ort und Stelle analysiert werden können. Andernfalls müssen Sie sie nach der Analyse von Fall zu Fall konvertieren.
quelle
In JSON ist kein Datumstyp integriert . Dies sieht aus wie die Anzahl der Sekunden / Millisekunden aus einer Epoche. Wenn Sie die Epoche kennen, können Sie das Datum erstellen, indem Sie die richtige Zeit hinzufügen.
quelle
Ich musste auch nach einer Lösung für dieses Problem suchen und stieß schließlich auf moment.js, eine nette Bibliothek, die dieses Datumsformat und vieles mehr analysieren kann.
Es ersparte mir Kopfschmerzen und ich dachte, ich würde es mit Ihnen teilen. :)
Weitere Informationen dazu finden Sie hier: http://momentjs.com/
quelle
Am Ende habe ich die "Zeichen in den regulären Ausdruck von Panos eingefügt, um die vom Microsoft-Serialisierer generierten Zeichen zu entfernen, wenn Objekte in ein Inline-Skript geschrieben werden:
Wenn Sie also eine Eigenschaft in Ihrem C # -Code-Behind haben , ist das so etwas wie
Und in deinem Aspx hast du
Du würdest so etwas bekommen
Beachten Sie die doppelten Anführungszeichen.
Um dies in eine Form zu bringen, die eval korrekt deserialisiert, habe ich verwendet:
Ich benutze Prototype und um es zu benutzen, habe ich hinzugefügt
quelle
In jQuery 1.5 können Sie alle von Ajax stammenden Daten wie folgt deserialisieren , solange Sie json2.js für ältere Browser verwenden müssen:
Ich habe eine Logik eingefügt, die davon ausgeht, dass Sie alle Daten vom Server als UTC senden (was Sie sollten). Der Verbraucher erhält dann ein JavaScript-
Date
Objekt, das den richtigen Ticks-Wert hat, um dies widerzuspiegeln. Das heißt, AnrufegetUTCHours()
usw. am Datum geben den gleichen Wert zurück wie auf dem Server und rufen angetHours()
den Wert in der lokalen Zeitzone des Benutzers zurück, der von seinem Browser festgelegt wurde.Das WCF- Format mit Zeitzonen-Offsets wird dabei nicht berücksichtigt , obwohl dies relativ einfach hinzuzufügen wäre.
quelle
Verwenden des Datumsauswahlprogramms für die jQuery-Benutzeroberfläche - ist nur dann wirklich sinnvoll, wenn Sie die jQuery-Benutzeroberfläche bereits einbeziehen:
Ausgabe:
quelle
Überdenken Sie das nicht. Übergeben Sie, wie wir es seit Jahrzehnten tun, einen numerischen Versatz von der De-facto-Standardepoche vom 1. Januar 1970 um Mitternacht GMT / UTC / & c in Sekunden (oder Millisekunden) seit dieser Epoche. JavaScript mag es, Java mag es, C mag es und das Internet mag es.
quelle
Jede dieser Antworten hat eines gemeinsam: Sie alle speichern Datumsangaben als einen einzigen Wert (normalerweise als Zeichenfolge).
Eine andere Möglichkeit besteht darin, die inhärente Struktur von JSON zu nutzen und ein Datum als Liste von Zahlen darzustellen:
Natürlich müssten Sie sicherstellen, dass beide Enden der Konversation über das Format (Jahr, Monat, Tag) und die Felder als Datumsangaben übereinstimmen. Dies hat jedoch den Vorteil, dass die Datumsangabe vollständig vermieden wird -zu-String-Konvertierung. Es sind alles Zahlen - überhaupt keine Zeichenketten. Die Verwendung der Reihenfolge: Jahr, Monat, Tag ermöglicht auch eine ordnungsgemäße Sortierung nach Datum.
Denken Sie hier nur über den Tellerrand hinaus - ein JSON-Datum muss nicht als Zeichenfolge gespeichert werden.
Ein weiterer Vorteil dieser Methode besteht darin, dass Sie einfach (und effizient) alle Datensätze für ein bestimmtes Jahr oder einen bestimmten Monat auswählen können, indem Sie die Art und Weise nutzen, wie CouchDB Abfragen zu Array-Werten verarbeitet.
quelle
Posting in einem tollen Thread:
quelle
Um hier noch einen weiteren Ansatz hinzuzufügen: Der von WCF verfolgte "Ticks-Ansatz" ist anfällig für Probleme mit Zeitzonen, wenn Sie nicht besonders vorsichtig sind, wie hier und an anderen Stellen beschrieben. Daher verwende ich jetzt das ISO 8601-Format, das sowohl von .NET als auch von JavaScript ordnungsgemäß unterstützt wird und Zeitzonen-Offsets enthält. Unten sind die Details:
In WCF / .NET:
Wobei CreationDate ein System.DateTime ist; ToString ( „o“) wird unter Verwendung von .NET Round-Trip - Formatbezeichner , die ein ISO 8601-konforme Datums - Zeichenfolge erzeugt
In JavaScript
Unmittelbar nach dem Abrufen des JSON korrigiere ich die Daten als JavaSript Date-Objekte mit dem Date-Konstruktor, der eine ISO 8601-Datumszeichenfolge akzeptiert ...
Sobald Sie ein JavaScript-Datum haben, können Sie alle praktischen und zuverlässigen Datumsmethoden wie toDateString , toLocaleString usw. verwenden.
quelle
Gibt es eine andere Option ohne Verwendung der jQuery-Bibliothek?
quelle
Dies kann Ihnen auch helfen.
quelle
Im Folgenden finden Sie eine ziemlich einfache Lösung zum Parsen von JSON-Daten. Verwenden Sie die folgenden Funktionen gemäß Ihren Anforderungen. Sie müssen nur das als Parameter abgerufene Datum im JSON-Format an die folgenden Funktionen übergeben:
quelle
Sie können auch die JavaScript-Bibliothek moment.js verwenden , die nützlich ist, wenn Sie planen, mit verschiedenen lokalisierten Formaten umzugehen und andere Vorgänge mit Datumswerten auszuführen:
Das Einrichten der Lokalisierung ist so einfach wie das Hinzufügen von Konfigurationsdateien (Sie erhalten sie bei momentjs.com) zu Ihrem Projekt und das Konfigurieren der Sprache:
quelle
Ich bekomme das Datum so:
In einigen Beispielen liegt das Datum in leicht unterschiedlichen Formaten vor:
usw.
Also habe ich mir folgendes RegExp ausgedacht:
und der endgültige Code lautet:
Ich hoffe es hilft.
Update: Ich habe diesen Link von Microsoft gefunden: Wie serialisiere ich Daten mit JSON?
Dies scheint die zu sein, nach der wir alle suchen.
quelle
Überprüfen Sie das Datum ISO-Standard; irgendwie so:
Es wird
2008.11.20T22:18
.quelle
Das ist frustrierend. Meine Lösung bestand darin, das "/ und /" aus dem vom JavaScriptSerializer von ASP.NET generierten Wert zu analysieren, damit JSON zwar kein Datumsliteral hat, es jedoch vom Browser als Datum interpretiert wird, was alles ist, was ich wirklich bin wollen:
{"myDate":Date(123456789)}
Benutzerdefinierter JavaScriptConverter für DateTime?
Ich muss die Richtigkeit von Roy Tinkers Kommentar betonen. Dies ist kein legaler JSON. Es ist ein schmutziger, schmutziger Hack auf dem Server, um das Problem zu beheben, bevor es zu einem Problem für JavaScript wird. Es wird einen JSON-Parser ersticken. Ich habe es benutzt, um vom Boden abzuheben, aber ich benutze es nicht mehr. Ich bin jedoch der Meinung, dass die beste Antwort darin besteht, die Formatierung des Datums durch den Server zu ändern, z. B. ISO, wie an anderer Stelle erwähnt.
quelle
Ein später Beitrag, aber für diejenigen, die diesen Beitrag durchsucht haben.
Stell dir das vor:
Wie Sie sehen können, verwende ich die Funktion von C # 3.0 zum Erstellen der "Auto" -Generika. Es ist ein bisschen faul, aber ich mag es und es funktioniert. Nur eine Anmerkung: Profil ist eine benutzerdefinierte Klasse, die ich für mein Webanwendungsprojekt erstellt habe.
quelle
Zu Ihrer Information, für alle, die Python auf der Serverseite verwenden: datetime.datetime (). Ctime () gibt eine Zeichenfolge zurück, die nativ nach "new Date ()" analysiert werden kann. Wenn Sie also eine neue datetime.datetime-Instanz erstellen (z. B. mit datetime.datetime.now), kann die Zeichenfolge in die JSON-Zeichenfolge aufgenommen werden, und diese Zeichenfolge kann dann als erstes Argument an den Date-Konstruktor übergeben werden. Ich habe noch keine Ausnahmen gefunden, aber ich habe es auch nicht zu streng getestet.
quelle
Mootools-Lösung:
Benötigt mootools-more. Getestet mit mootools-1.2.3.1-more unter Firefox 3.6.3 und IE 7.0.5730.13
quelle
quelle
Fügen Sie das jQuery UI- Plugin zu Ihrer Seite hinzu:
quelle
Was ist, wenn .NET zurückkehrt ...
Und dann in JavaScript ...
quelle