2009-06-19 19 views
217

Powiel możliwe:
How to format a JSON date?Konwersja .NET DateTime do JSON

Moje usługi wstęg wraca DateTime na wezwanie jQuery. Usługa zwraca dane w następującym formacie:

/Date(1245398693390)/ 

Jak mogę przekonwertować to do daty przyjazną obsługę JavaScript?

+0

Zobacz http://stackoverflow.com/questions/206384/how-to-format-a-json-date –

Odpowiedz

233

Co jest zwracany jest milisekund od epoki. Można zrobić:

var d = new Date(); 
d.setTime(1245398693390); 
document.write(d); 

Na jak formatować datę dokładnie tak, jak chcesz, zobacz pełną Date odniesienie w http://www.w3schools.com/jsref/jsref_obj_date.asp

można rozebrać niepodlegania cyfry albo parsowania Integer (as suggested here):

var date = new Date(parseInt(jsonDate.substr(6))); 

lub zastosowanie następujące wyrażenia regularne (od Tominator w komentarzach):

var jsonDate = jqueryCall(); // returns "/Date(1245398693390)/"; 
var re = /-?\d+/; 
var m = re.exec(jsonDate); 
var d = new Date(parseInt(m[0])); 
+37

Lub po prostu var d = new Date (1245398693390); –

+23

Przydaje się to również: var re =/-? \ D + /; var m = re.exec (json_date_string); var d = new Date (parseInt (m [0])); – Tominator

+6

jak analizujesz "/ Date (" i po prostu chwytam numer? – leora

6

Możesz wypróbować bibliotekę innej firmy, np. json.net. Dokumentacja znajduje się na stronie projektu. Mówi, że wymaga .net 3.5.

W przeciwnym razie istnieje inny o nazwie Nii.json, który, jak sądzę, jest portem z java. Znalazłem link do niego na this blog

77

I zostały z wykorzystaniem tej metody przez chwilę:

using System; 

public static class ExtensionMethods { 
    // returns the number of milliseconds since Jan 1, 1970 (useful for converting C# dates to JS dates) 
    public static double UnixTicks(this DateTime dt) 
    { 
    DateTime d1 = new DateTime(1970, 1, 1); 
    DateTime d2 = dt.ToUniversalTime(); 
    TimeSpan ts = new TimeSpan(d2.Ticks - d1.Ticks); 
    return ts.TotalMilliseconds; 
    } 
} 

Zakładając, że rozwijają się przed .NET 3.5, jest to proste kopiuj/wklej. Możesz go inaczej przesłać.

Można to enkapsulować w obiekcie JSON lub po prostu zapisać w strumieniu odpowiedzi.

Na stronie Javascript/JSON, przekonwertować to do daty po prostu przechodząc przez kleszcze do nowego obiektu Date:

jQuery.ajax({ 
    ... 
    success: function(msg) { 
    var d = new Date(msg); 
    } 
} 
+0

używam kodu w języku C# .Net4 .0 konwertuje C# daty w JSON (REST), ale nie daje mi właściwej konwersji dla dat JS. Oto przykład prawidłowego zwrócenia przez Json-Rest: C# date: 2009-09-12 00:00:00, jest równa JSdate: Data (1252684800000 + 0800). Twój kod daje mi wartość: DATE (-28800000), która jest niedopuszczalna przez json. Jakie jest twoje rozwiązanie tego problemu? .. dzięki – fiberOptics

+0

Zmień dwukrotnie na ciąg z formatem ToString ("#"). Double może zwracać liczby dziesiętne i wprowadzać błąd w niektórych przypadkach. – harveyt

+0

new Data (msg) nie przyjmuje ciągu. Więc nie zapomnij parseInt (jak w innych odpowiedziach na tej stronie). – Tillito

16

Jeśli masz problemy z dostaniem się do informacji o czasie, można spróbować coś takiego:

d.date = d.date.replace('/Date(', ''); 
    d.date = d.date.replace(')/', ''); 
    var expDate = new Date(parseInt(d.date)); 
+1

można pominąć drugie zdanie zastępujące, ponieważ 'parseInt ('1234abcd') zwraca 1234' w js – amd

16

Jeśli zdać DateTime z a.Kod netto z kodem JavaScript, C#:

DateTime net_datetime = DateTime.Now; 

JavaScript traktuje ją jako ciąg, jak "/Date(1245398693390)/":

można przekształcić go jako fllowing:

// convert the string to date correctly 
var d = eval(net_datetime.slice(1, -1)) 

czyli

// convert the string to date correctly 
var d = eval("/Date(1245398693390)/".slice(1, -1)) 
+32

' eval' uznany za szkodliwy. –

33

Aby przeanalizować ciąg daty za pomocą String.replace za pomocą b pochwała:

var milli = "/Date(1245398693390)/".replace(/\/Date\((-?\d+)\)\//, '$1'); 
var d = new Date(parseInt(milli)); 
+4

Korzystanie z wyrażenia regularnego jest przesadą dla tego przykładu. Po prostu użyj 'new Date (parseInt (milli.substr (6));', aby rozpocząć analizowanie w numerycznej części łańcucha. –

4

Pomyślałem, że dodam rozwiązanie, którego używam.

Jeśli korzystasz z System.Web.Script.Serialization.JavaScriptSerializer(), czas zwrócony nie będzie właściwy dla Twojej strefy czasowej. Aby to naprawić, będziesz również chciał użyć numeru dte.getTimezoneOffset(), aby przywrócić go do właściwego czasu.

String.prototype.toDateFromAspNet = function() { 
    var dte = eval("new " + this.replace(/\//g, '') + ";"); 
    dte.setMinutes(dte.getMinutes() - dte.getTimezoneOffset()); 
    return dte; 
} 

teraz będziesz wystarczy zadzwonić

"/Date(1245398693390)/".toDateFromAspNet(); 

piątek 19 czerwca 2009 00:04:53 GMT-0400 (Eastern Daylight Time) {}

+3

'eval' uważane za szkodliwe. –

+1

Ma swoje miejsca. Myślę, że to jedyny przypadek, w którym go użyłem. Jeśli chodzi o kwestie bezpieczeństwa, powiedziałbym, że jest to w porządku w tym kontekście, ponieważ nie wyciągamy z niczego, co można publicznie zmienić, na przykład w polu zapytania lub formularza. Oczywiście każdy, kto ma zamiar, może zrobić, co mu się podoba, czy eval jest używany, czy nie jest to skrypt klienta. – used2could

+0

Oprócz problemów związanych z bezpieczeństwem, 'eval' jest nieefektywne i zapobiega działaniu wielu optymalizatorów JavaScript i minifier. Jeśli używasz 'eval' do czegoś innego niż analizowanie JSON, prawdopodobnie istnieje lepszy sposób na zrobienie tego. –

5

Dotychczasowe odpowiedzi wszystkie stwierdzą, że możesz wykonać następujące czynności:

var d = eval(net_datetime.slice(1, -1)); 

Jednak to nie działa w obu Chrome lub FF, bo to, co coraz oceniano dosłownie:

// returns the current timestamp instead of the specified epoch timestamp 
var d = Date([epoch timestamp]); 

Poprawny sposób to zrobić:

var d = eval("new " + net_datetime.slice(1, -1)); // which parses to 

var d = new Date([epoch timestamp]); 
+2

'eval' uważane za szkodliwe. –

+0

Zauważyłem, że ta wersja zapewnia przesunięcie strefy czasowej: UTC ..... Przykład: Wt. 20 09:44:41 EDT 2011. Inne wersje nie miały "EDT". Dzięki, Cowmoo. – granadaCoder

10

Konwersja z 1970,1,1 wymaga podwójnego zaokrąglenia do zera miejsca dziesiętnego, myślę, że

DateTime d1 = new DateTime(1970, 1, 1); 
DateTime d2 = dt.ToUniversalTime(); 
TimeSpan ts = new TimeSpan(d2.Ticks - d1.Ticks); 
return Math.Round(ts.TotalMilliseconds,0); 

po stronie klienta używam

new Date(+data.replace(/\D/g, '')); 
+0

fajna sztuczka dla 'nowej daty (+ data.replace (/ \ D/g, ''));' – kite