2013-08-08 3 views
7

die Daten in der DB wie folgt aussehenAsp-net web api Ausgabe Datetime mit dem Buchstaben T

2011-09-07 14:43:22.520 

Aber meine Web-API gibt die Daten und ersetzen Sie den Raum mit dem Buchstaben T

2011-09-07T14:43:22.520 

Ich kann den Buchstaben T durch ein Leerzeichen in jquery ersetzen, aber kann ich dieses Problem von der Web-API beheben (die Web-API gibt die Originaldaten aus?)

Ich möchte auch nicht die Millisekunden am Ende. Wie kann ich sie loswerden?

+0

'" 2011-09-07 14: 43: 22.520 "' ist gut für Chrome '" 2011-09-07T14: 43: 22.520 "wirft einen Fehler in FF => Datum {Ungültiges Datum}' versuchen Sie 'new Date (datestring)' und Sie werden sehen – Jaider

Antwort

31

Das Format, wie Sie das Datum in der Datenbank sehen, ist normalerweise irrelevant, da es in .Net als DateTime - nicht als string übergeben werden sollte. (Wenn Sie es als varchar in der Datenbank speichern, müssen Sie ein größeres Problem.)

ASP.Net WebAPI den Wert im Format von ISO8601 und RFC3339 definiert zurückkehrt. Dies ist eine gute Sache, da es ein anerkanntes maschinenlesbares Format ist. Sie wollen es wahrscheinlich nicht ändern.

Wenn Sie es wirklich ändern möchten, müssen Sie ein benutzerdefiniertes JSON.Net JsonConverter implementieren, das von DateTimeConverterBase abgeleitet wird. Dies wird diskutiert here und here.

Aber stattdessen sollten Sie überlegen, wie Sie das tatsächliche Ergebnis in Ihrer Client-Anwendung verwenden. Sie haben jQuery erwähnt, daher nehme ich an, dass Ihr Kunde JavaScript ist. In vielen Browsern, die Sie der ISO8601-Wert haben, ist bereits vom Date Konstruktor JavaScript erkannt, so Sie in der Lage sein könnten, dies nur zu tun:

var dt = new Date("2011-09-07T14:43:22.520"); 

Aber diese won't work in all browsers. Und Date hat nicht viel Flexibilität beim Formatieren. Stattdessen sollten Sie eine Bibliothek wie moment.js in Betracht ziehen. Mit dem im Ort, können Sie dies tun:

var m = moment("2011-09-07T14:43:22.520"); 
var s = m.format("YYYY-MM-DD HH:mm:ss"); // output: "2011-09-07 14:43:22" 

Bitte beachten Sie, dass der Format-String hier moment.js entspricht, nicht zu .NET. Es gibt Unterschiede in der Groß-/Kleinschreibung. Einzelheiten finden Sie unter the moment.js documentation.

Eine andere Sache - da der Wert, den Sie nicht zur Verfügung gestellt nicht hat entweder ein Z am Ende, noch hat eine Offset wie -07:00, dann gehe ich davon kam es aus einem DateTime whos .Kind Wert DateTimeKind.Unspecified ist. Sie sollten sich darüber im Klaren sein, dass es keine Informationen darüber gibt, welche Zeitzone dargestellt wird, wenn diese in JavaScript (oder anderswo) gesendet wird. JavaScript übernimmt die lokale Zeitzone des Browsers.

Wenn das nicht das ist, was Sie beabsichtigt haben, müssen Sie UTC-Werte in Ihrer Datenbank speichern und sicherstellen, dass sie DateTimeKind.Utc haben, damit sie am Ende mit einem Z serialisiert werden. JavaScript wird dies auf die Zeitzone des Browsers normalisieren, aber Sie werden immer noch über denselben Zeitpunkt sprechen.

Alternativ können Sie einen -Typ verwenden, der mit dem spezifischen Offset serialisiert wird. JavaScript wird dies weiterhin auf die Zeitzone des Benutzers normalisieren.

+2

Schöne, umfassende Antwort. Und ich würde einen Bonus von +1 für die Einführung von mir in moment.js geben, wenn ich könnte –