2013-08-08 26 views
7

dane w DB wyglądać następującoAsp-net Web API wyjście datetime z literą T

2011-09-07 14:43:22.520 

Ale moja Web API wysyła dane i zastąpić przestrzeń na literę T

2011-09-07T14:43:22.520 

Mogę zastąpić literę T spacją ponownie w jquery, ale czy mogę naprawić ten problem z interfejsu API WWW (czy wyjściowy interfejs API api jest oryginalny?)

Ja też nie chcę milisekund na końcu. Jak mogę się ich pozbyć?

+0

'" 2011-09-07 14: 43: 22.520 "' jest dobre dla Chrome '" 2011-09-07T14: 43: 22.520 "' zgłasza błąd w FF => 'Data {Invalid Date}' spróbuj 'new Date (datestring)', a zobaczysz – Jaider

Odpowiedz

31

Format sposobu wyświetlania daty w bazie danych jest zwykle nieistotny, ponieważ powinien zostać przekazany do .Net jako DateTime - a nie jako string. (W przypadku przechowywania go jako varchar w bazie danych, masz większy problem.)

ASP.Net WebAPI jest zwrócenie wartości w formacie określonym przez ISO8601 i RFC3339. Jest to dobre rozwiązanie, ponieważ jest to uznawany format do odczytu maszynowego. Prawdopodobnie nie chcesz tego zmienić.

Jeśli naprawdę chcesz to zmienić, musisz zaimplementować niestandardową wersję JSON.Net JsonConverter, pochodzącą z DateTimeConverterBase. Jest to omówione here i here.

Zamiast tego należy rozważyć, w jaki sposób używasz rzeczywistego wyniku w aplikacji klienckiej. Wspomniałeś o jQuery, więc założę się, że twoim klientem jest JavaScript. W wielu przeglądarek, wartość ISO8601, że masz już uznane przez konstruktora JavaScript Date, więc może być w stanie po prostu to zrobić:

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

Ale to won't work in all browsers. I Date nie ma dużej elastyczności, jeśli chodzi o formatowanie. Zamiast tego warto rozważyć bibliotekę, taką jak moment.js. Mając to na miejscu, można to zrobić:

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" 

Należy pamiętać, że ciąg formatu tutaj zgodny moment.js, nie .NET. Istnieją różnice w wielkości liter. Szczegółowe informacje znajdują się w the moment.js documentation.

Jeszcze jedno - ponieważ wartość podałeś nie ma albo Z na końcu, ani nie ma przesunięcia takich jak -07:00, to zakładam, że pochodził z DateTime whos .Kind wartość jest DateTimeKind.Unspecified. Należy pamiętać, że kiedy zostanie on przesłany do JavaScript (lub gdziekolwiek indziej), nie ma informacji o tym, jaka strefa czasowa jest reprezentowana. JavaScript przyjmie lokalną strefę czasową przeglądarki .

Jeśli nie jest to zgodne z zamierzeniem, musisz przechowywać wartości UTC w bazie danych i upewnić się, że mają one DateTimeKind.Utc, więc zostaną oznaczone na końcu serią z Z na końcu. JavaScript znormalizuje to do strefy czasowej przeglądarki, ale nadal będziesz mówić o tej samej chwili w czasie.

Alternatywnie można użyć typu DateTimeOffset - który będzie serializować z określonym przesunięciem. JavaScript nadal będzie znormalizować to do strefy czasowej użytkownika.

+2

Ładna, wyczerpująca odpowiedź. I dałbym premię +1 za wprowadzenie mnie na moment.js, gdybym mógł –