Pierwszy raz robię crack w Ajaxie z jQuery. Dostaję moje dane na moją stronę, ale mam problemy z danymi JSON zwracanymi dla typów danych Date. Zasadniczo otrzymuję ciąg znaków, który wygląda następująco:
/Date(1224043200000)/
Od kogoś zupełnie nowego do JSON - Jak sformatować to na krótki termin? Czy należy to rozwiązać gdzieś w kodzie jQuery? Próbowałem jQuery.UI.datepicker
używać wtyczki $.datepicker.formatDate()
bez powodzenia.
FYI: Oto rozwiązanie, które wymyśliłem, używając kombinacji odpowiedzi tutaj:
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;
}
To rozwiązanie pobrało mój obiekt z metody wywołania zwrotnego i poprawnie wyświetlało daty na stronie przy użyciu biblioteki formatu daty.
Date
.Odpowiedzi:
eval()
to nie jest konieczne. To zadziała dobrze:substr()
Funkcja wyjmuje/Date(
część orazparseInt()
funkcja pobiera całkowitą i ignoruje)/
na końcu. Wynikowa liczba jest przekazywana doDate
konstruktora.Celowo pominąłem podstawkę (drugi argument do
parseInt
); zobacz mój komentarz poniżej .Ponadto całkowicie zgadzam się z komentarzem Rory'ego : daty ISO-8601 są preferowane w stosunku do tego starego formatu - więc ten format zasadniczo nie powinien być używany do nowego programowania. Zobacz doskonałą bibliotekę Json.NET, która stanowi doskonałą alternatywę szeregowania dat przy użyciu formatu ISO-8601.
W przypadku dat JSON sformatowanych według ISO-8601 wystarczy przekazać ciąg do
Date
konstruktora:źródło
Możesz użyć tego, aby uzyskać datę z JSON:
Następnie możesz użyć skryptu formatu daty JavaScript (1,2 KB po zminimalizowaniu i spakowaniu gzip), aby wyświetlić go tak, jak chcesz.
źródło
jsonDate = new Date(+jsonDate.replace(/\/Date\((\d+)\)\//, '$1'));
new Function
jest prawie tak zły, jakeval
: dev.opera.com/articles/view/efficient-javascript/…Dla tych, którzy używają Newtonsoft Json.NET , przeczytaj, jak to zrobić przez Native JSON w IE8, Firefox 3.5 oraz Json.NET .
Przydatna jest również dokumentacja dotycząca zmiany formatu dat napisana przez Json.NET: Serializacja dat w Json.NET
Dla tych, którzy są zbyt leniwi, oto krótkie kroki. Ponieważ JSON ma luźną implementację DateTime, musisz użyć
IsoDateTimeConverter()
. Zauważ, że od Json.NET 4.5 domyślnym formatem daty jest ISO, więc poniższy kod nie jest potrzebny.JSON przejdzie jako
Na koniec niektóre JavaScript do konwersji daty ISO na datę JavaScript:
Użyłem tego w ten sposób
źródło
new Date("2009-04-12T20:44:55")
+a[1]
etc reprezentuje elementy tablicy wyrażenia regularnego, a+
rzutowałby ją na liczbę, więc+a[1]
jest równa2009
itp. Oto podział tablicy:0: "2009-04-12T20:44:55" 1: "2009" 2: "04" 3: "12" 4: "20" 5: "44" 6: "55"
Oryginalny przykład:
nie odzwierciedla formatowania używanego przez WCF podczas wysyłania dat przez REST WCF przy użyciu wbudowanej serializacji JSON. (przynajmniej w .NET 3.5, SP1)
Uznałem, że odpowiedź tutaj jest pomocna, ale wymagana jest niewielka modyfikacja wyrażenia regularnego, ponieważ wydaje się, że przesunięcie strefy czasowej GMT jest dołączane do liczby zwracanej (od 1970 r.) W WCF JSON.
W serwisie WCF mam:
ApptVisitLinkInfo definiuje się po prostu:
Gdy „Field2” jest zwracane jako Json z usługi, wartość wynosi:
Zwróć uwagę na przesunięcie strefy czasowej uwzględnione jako część wartości.
Zmodyfikowane wyrażenie regularne:
Jest nieco bardziej chętny i chwyta wszystko między parens, nie tylko pierwszą liczbę. Wynikowy czas sinze 1970 plus przesunięcie strefy czasowej można wprowadzić do eval, aby uzyskać obiekt daty.
Wynikowa linia JavaScript do zamiany to:
źródło
Nie powtarzaj się - zautomatyzuj konwersję dat za pomocą
$.parseJSON()
Odpowiedzi na Twój post zapewniają ręczną konwersję dat na daty JavaScript. Rozszerzyłem jQuery
$.parseJSON()
tylko trochę, więc jest w stanie automatycznie parsować daty, kiedy go poinstruujesz. Przetwarza daty w formacie ASP.NET (/Date(12348721342)/
) oraz daty w formacie ISO (2010-01-01T12.34.56.789Z
), które są obsługiwane przez rodzime funkcje JSON w przeglądarkach (i bibliotekach takich jak json2.js).Tak czy siak. Jeśli nie chcesz powtarzać kodu konwersji daty w kółko, sugeruję przeczytanie tego postu na blogu i uzyskanie kodu, który ułatwi ci życie.
źródło
Jeśli powiesz w JavaScript,
zobaczysz, że jest to poprawna data i możesz jej użyć w dowolnym miejscu w kodzie JavaScript z dowolnym frameworkiem.
źródło
Kliknij tutaj, aby sprawdzić wersję demo
JavaScript / jQuery
Wynik - „10/15/2008”
źródło
Zaktualizowano
Mamy wewnętrzną bibliotekę interfejsu użytkownika, która musi poradzić sobie zarówno z wbudowanym formatem JSON Microsoft.NET.NET firmy Microsoft, jak
/Date(msecs)/
pierwotnie zapytano o nią, jak i z większością formatu daty JSON, w tym JSON.NET2014-06-22T00:00:00.0
. Ponadto musimy poradzić sobie z niezdolnością oldIE do radzenia sobie z czymkolwiek innym niż 3 miejsca dziesiętne .Najpierw wykrywamy, jaką datę zużywamy, analizujemy w zwykły
Date
obiekt JavaScript , a następnie formatujemy.1) Wykryj format daty Microsoft
2) Wykryj format daty ISO
3) Format daty parsowania MS:
4) Analizuj format daty ISO.
Mamy przynajmniej sposób na upewnienie się, że mamy do czynienia ze standardowymi datami ISO lub datami ISO zmodyfikowanymi tak, aby zawsze miały trzy milisekundowe miejsca ( patrz wyżej ), więc kod różni się w zależności od środowiska.
4a) Analizować standardowy format daty ISO, radzić sobie z problemami oldIE:
4b) Parsuj format ISO ze stałymi miejscami dziesiętnymi milisekund - znacznie łatwiej:
5) Sformatuj:
6) Zwiąż wszystko razem:
Poniższa stara odpowiedź jest przydatna do powiązania formatowania daty z własnym parsowaniem JSON jQuery, aby uzyskać obiekty Date zamiast ciągów, lub jeśli nadal utkniesz w jQuery <1.5.
Stara odpowiedź
Jeśli używasz funkcji Ajax jQuery 1.4 z ASP.NET MVC, możesz przekształcić wszystkie właściwości DateTime w obiekty Date za pomocą:
W jQuery 1.5 możesz uniknąć
parseJSON
globalnego zastąpienia metody, używając opcji konwerterów w wywołaniu Ajax.http://api.jquery.com/jQuery.ajax/
Niestety musisz przełączyć się na starszą ścieżkę ewaluacyjną, aby Daty mogły parsować globalnie w miejscu - w przeciwnym razie musisz je przekonwertować po analizie poszczególnych przypadków.
źródło
W JSON nie ma wbudowanego typu daty . Wygląda to na liczbę sekund / milisekund z pewnej epoki. Jeśli znasz epokę, możesz utworzyć datę, dodając odpowiednią ilość czasu.
źródło
Musiałem także znaleźć rozwiązanie tego problemu i ostatecznie natknąłem się na moment.js, która jest fajną biblioteką, która może analizować ten format daty i wiele innych.
Oszczędzało mi to bólu głowy, więc pomyślałem, że podzielę się tym z tobą. :)
Więcej informacji na ten temat można znaleźć tutaj: http://momentjs.com/
źródło
Skończyło się na dodawaniu „znaków do wyrażenia regularnego Panos, aby pozbyć się tych generowanych przez serializator Microsoft podczas pisania obiektów w skrypcie wbudowanym:
Więc jeśli masz właściwość w swoim C # za kodem , to coś takiego
A w aspx masz
Dostałbyś coś takiego
Zwróć uwagę na podwójne cytaty.
Aby przekształcić to w postać, która eval poprawnie poprawi deserializację, użyłem:
Używam Prototypu i do tego dodałem
źródło
W jQuery 1.5, o ile masz plik json2.js na starsze przeglądarki, możesz dokonać deserializacji wszystkich dat pochodzących z Ajax w następujący sposób:
Podałem logikę, która zakłada, że wysyłasz wszystkie daty z serwera jako UTC (co powinieneś); konsument otrzymuje następnie
Date
obiekt JavaScript, który ma odpowiednią wartość tików, aby to odzwierciedlić. Oznacza to, że wywołaniegetUTCHours()
itp. W dniu zwróci tę samą wartość, co na serwerze, a wywołaniegetHours()
zwróci wartość w lokalnej strefie czasowej użytkownika określonej przez przeglądarkę.Nie bierze to pod uwagę formatu WCF z przesunięciami stref czasowych, chociaż byłoby to stosunkowo łatwe do dodania.
źródło
Korzystanie z datepicker interfejsu użytkownika jQuery - naprawdę ma sens tylko wtedy, gdy już dołączasz interfejs użytkownika jQuery:
wynik:
źródło
Nie przesadzaj z tym. Tak jak robiliśmy to od dziesięcioleci, podaj liczbowe przesunięcie w stosunku do faktycznej standardowej epoki 1 stycznia 1970 r. O północy GMT / UTC / cw liczbie sekund (lub milisekund) od tej epoki. JavaScript to lubi, Java to lubi, C to lubi, a Internet to lubi.
źródło
Każda z tych odpowiedzi ma jedną wspólną cechę: wszystkie przechowują daty jako jedną wartość (zwykle ciąg znaków).
Inną opcją jest skorzystanie z wbudowanej struktury JSON i przedstawienie daty jako listy liczb:
Oczywiście musisz upewnić się, że oba końce rozmowy zgadzają się co do formatu (rok, miesiąc, dzień) i które pola mają być datami, ale ma tę zaletę, że całkowicie omija problem daty konwersja na ciąg znaków. To wszystkie liczby - bez żadnych ciągów. Ponadto, korzystając z zamówienia: rok, miesiąc, dzień, można również prawidłowo sortować według daty.
Po prostu myślę tutaj nieszablonowo - data JSON nie musi być przechowywana jako ciąg.
Kolejną zaletą robienia tego w ten sposób jest to, że możesz łatwo (i wydajnie) wybierać wszystkie rekordy dla danego roku lub miesiąca, wykorzystując sposób, w jaki CouchDB obsługuje zapytania o wartości macierzy.
źródło
Publikowanie w niesamowitym wątku:
źródło
Aby dodać tutaj inne podejście, „podejście tykania”, które stosuje WCF, jest podatne na problemy ze strefami czasowymi, jeśli nie jesteś wyjątkowo ostrożny, jak opisano tutaj i w innych miejscach. Teraz używam formatu ISO 8601, który odpowiednio obsługuje .NET i JavaScript, który obejmuje przesunięcia stref czasowych. Poniżej znajdują się szczegóły:
W WCF / .NET:
Gdzie CreationDate jest System.DateTime; ToString („o”) używa specyfikatora formatu .NET w obie strony, który generuje ciąg daty zgodny z ISO 8601
W JavaScript
Zaraz po pobraniu JSON idę ustawić daty na obiekty JavaSript Date za pomocą konstruktora Date, który akceptuje ciąg dat ISO 8601 ...
Gdy masz już datę JavaScript, możesz użyć wszystkich wygodnych i niezawodnych metod Date, takich jak toDateString , toLocaleString itp.
źródło
Czy istnieje inna opcja bez korzystania z biblioteki jQuery?
źródło
To może ci również pomóc.
źródło
Poniżej znajduje się dość proste rozwiązanie do analizowania dat JSON. Skorzystaj z poniższych funkcji zgodnie z wymaganiami. Musisz tylko przekazać datę JSON formatu pobranego jako parametr do poniższych funkcji:
źródło
Możesz także skorzystać z biblioteki JavaScript moment.js , która jest przydatna, gdy planujesz radzić sobie z różnymi zlokalizowanymi formatami i wykonywać inne operacje z wartościami dat:
Konfigurowanie lokalizacji jest tak proste, jak dodawanie plików konfiguracyjnych (otrzymujesz je na momentjs.com) do projektu i konfigurowanie języka:
źródło
Mam taką datę:
W niektórych przykładach data jest w nieco innych formatach:
itp.
Więc wymyśliłem następujący RegExp:
a końcowy kod to:
Mam nadzieję, że to pomoże.
Aktualizacja: Znalazłem ten link od Microsoft: Jak mogę serializować daty w JSON?
Wygląda na to, że wszyscy tego szukamy.
źródło
Sprawdź datę normy ISO; coś takiego:
Staje się
2008.11.20T22:18
.źródło
To jest frustrujące. Moim rozwiązaniem było przeanalizowanie „/ i /” z wartości wygenerowanej przez JavaScriptSerializer ASP.NET, aby chociaż JSON mógł nie mieć literału daty, nadal jest interpretowany przez przeglądarkę jako data, i tak naprawdę wszystko chcieć:
{"myDate":Date(123456789)}
Niestandardowy konwerter JavaScript dla DateTime?
Muszę podkreślić trafność komentarza Roya Tinkera. To nie jest legalne JSON. Jest to brudny, brudny hack na serwerze, aby usunąć problem, zanim stanie się problemem dla JavaScript. Udusi parser JSON. Użyłem go do zejścia z ziemi, ale już go nie używam. Jednak nadal uważam, że najlepszą odpowiedzią jest zmiana sposobu formatowania daty przez serwer, na przykład ISO, jak wspomniano w innym miejscu.
źródło
Późny post, ale dla tych, którzy szukali tego postu.
Wyobraź to sobie:
Jak widać, używam funkcji C # 3.0 do tworzenia generycznych „Auto”. To trochę leniwe, ale podoba mi się i działa. Tylko uwaga: Profile to niestandardowa klasa, którą stworzyłem dla mojego projektu aplikacji internetowej.
źródło
Do Twojej wiadomości dla każdego, kto używa Pythona po stronie serwera: datetime.datetime (). Ctime () zwraca ciąg, który można natywnie przetwarzać przez „new Date ()”. Oznacza to, że jeśli utworzysz nową instancję datetime.datetime (na przykład z datetime.datetime.now), ciąg może zostać zawarty w ciągu JSON, a następnie ten ciąg może zostać przekazany jako pierwszy argument do konstruktora Date. Nie znalazłem jeszcze żadnych wyjątków, ale też nie testowałem tego zbyt rygorystycznie.
źródło
Rozwiązanie Mootools:
Wymaga mootools-more. Testowane przy użyciu mootools-1.2.3.1-more w Firefox 3.6.3 i IE 7.0.5730.13
źródło
źródło
Dodaj wtyczkę interfejsu użytkownika jQuery na swojej stronie:
źródło
Co jeśli .NET zwróci ...
A potem w JavaScript ...
źródło