Conversione di .NET DateTime in JSON

Possibile duplicato:
Come formattare una data JSON?

Il mio servizio web sta restituendo un DateTime a una chiamata jQuery. Il servizio restituisce i dati in questo formato:

/Date(1245398693390)/ 

Come posso convertirlo in una data adatta per JavaScript?

Ciò che viene restituito è millisecondi dall’epoca. Potresti fare:

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

Su come formattare la data esattamente come vuoi, consulta la sezione Riferimento completo alla pagina http://www.w3schools.com/jsref/jsref_obj_date.asp

È ansible eliminare le non cifre eseguendo l’analisi del numero intero ( come suggerito qui ):

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

O applicando la seguente espressione regolare (da Tominator nei commenti):

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

Sto usando questo metodo per un po ‘:

 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; } } 

Supponendo che si stia sviluppando contro .NET 3.5, si tratta di una copia / incolla diretta. Puoi altrimenti portarlo.

Puoi incapsulare questo in un object JSON, o semplicemente scriverlo nel stream di risposta.

Sul lato Javascript / JSON, lo si converte in una data semplicemente passando i tick in un nuovo object Date:

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

Per analizzare la stringa della data utilizzando String.replace con backreference:

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

Se passi un DateTime da un codice .Net a un codice javascript, C #:

 DateTime net_datetime = DateTime.Now; 

javascript lo tratta come una stringa, come "/Date(1245398693390)/" :

Puoi convertirlo come fllowing:

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

o:

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

Se hai problemi a trovare le informazioni sul tempo, puoi provare qualcosa di simile a questo:

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

la conversione dal 1970,1,1 ha bisogno delle doppie cifre decimali arrotondate a zero, secondo me

 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); 

sul lato client che uso

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

http://stevenlevithan.com/assets/misc/date.format.js

 var date = eval(data.Data.Entity.Slrq.replace(/\/Date\((\d )\)\//gi, "new Date($1)")); alert(date.format("yyyy-MM-dd HH:mm:ss")); alert(dateFormat(date, "yyyy-MM-dd HH:mm:ss")); 

Puoi provare una libreria di terze parti come json.net. C’è la documentazione sul sito del progetto. Dice che richiede. 3.5 3.5.

Altrimenti ce n’è un altro chiamato Nii.json che credo sia un porto di java. Ho trovato un link ad esso su questo blog

Le risposte precedenti indicano che è ansible eseguire quanto segue:

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

Tuttavia, questo non funziona in Chrome o FF perché ciò che viene valutato letteralmente è:

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

Il modo corretto per farlo è:

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

Ho pensato di aggiungere la mia soluzione che stavo usando.

Se stai utilizzando System.Web.Script.Serialization.JavaScriptSerializer() il tempo restituito non sarà specifico per il tuo fuso orario. Per risolvere questo problema, ti consigliamo di utilizzare dte.getTimezoneOffset() per riportarlo all’ora corretta.

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

ora chiamerai semplicemente

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

Ven 19 giu 2009 00:04:53 GMT-0400 (Eastern Daylight Time) {}