2009-06-19 14 views
217

Eventuali duplicati:
How to format a JSON date?Conversione .NET DateTime a JSON

Il mio servizio ragnatele sta tornando 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?

+0

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

risposta

233

cosa viene restituito è millisecondi dalla epoca. Si potrebbe fare:

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

su come formattare la data esattamente come si desidera, di consultare il pieno Date riferimento http://www.w3schools.com/jsref/jsref_obj_date.asp

Si potrebbe striscia la non-cifre da una analisi del numero intero (as suggested here):

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

o applicare 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])); 
+37

Oppure solo var d = new Date (1245398693390); –

+23

Anche questo è utile: var re =/-? \ D + /; var m = re.exec (json_date_string); var d = new Date (parseInt (m [0])); – Tominator

+6

come stai analizzando "/ Date (" e appena afferrando il numero? – leora

6

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 c'è un altro chiamato Nii.json che credo sia un porto di java. Ho trovato un link ad esso sul this blog

77

Ho utilizzato 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 sta sviluppando contro .NET 3.5, è un copia/incolla dritto. Puoi altrimenti portarlo.

È possibile incapsulare questo in un oggetto JSON, o semplicemente scriverlo nel flusso di risposta.

Sul lato Javascript/JSON, si converte questo per una data semplicemente passando le zecche in un nuovo oggetto Date:

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

io uso il codice in C# .Net4 .0 per convertire le date di C# in JSON (REST), ma non mi dà la giusta conversione per le date di JS. Ecco un esempio di conversione corretta restituita da Json-Rest: C# date: 2009-09-12 00:00:00, uguale a JSdate: Date (1252684800000 + 0800). Il tuo codice mi dà un valore di: DATE (-28800000) che non è accettabile da json. Qual è la tua soluzione a questo? .. grazie – fiberOptics

+0

Cambia da doppio a stringa con il formato ToString ("#"). Double can restituisce decimali e introduce un bug in alcuni casi – harveyt

+0

new Date (msg) non accetta una stringa. Quindi non dimenticare parseInt (come nelle altre risposte in questa pagina). – Tillito

16

Se hai difficoltà a raggiungere le informazioni di tempo, si può provare qualcosa di simile:

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

è possibile saltare la seconda istruzione di sostituzione poiché 'parseInt ('1234abcd') restituisce 1234' in js – amd

16

Se si passa un DateTime da un.Codice Net per un codice javascript, C#:

DateTime net_datetime = DateTime.Now; 

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

È possibile convertire 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)) 
+32

' eval' considerato dannoso. –

33

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

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

L'uso di un'espressione regolare è eccessivo per questo esempio. Basta usare 'new Date (parseInt (milli.substr (6)));' per iniziare l'analisi alla parte numerica della stringa. –

4

ho pensato di aggiungere la mia soluzione che ho usato.

Se si utilizza il System.Web.Script.Serialization.JavaScriptSerializer(), il tempo restituito non sarà specifico per il fuso orario. Per risolvere questo problema, ti consigliamo di utilizzare dte.getTimezoneOffset() per tornare all'orario corretto.

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

ora ti basta chiamare

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

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

+3

'eval' considerato dannoso. –

+1

Ha i suoi posti. Penso che questa sia l'unica istanza in cui l'ho usato. Per quanto riguarda i problemi di sicurezza, direi che va bene in questo contesto, perché non stiamo tirando da tutto ciò che è modificabile pubblicamente come un campo di querystring o modulo. Ovviamente chiunque abbia intenzione può fare ciò che preferisce, sia che venga usato eval sia che sia script client. – used2could

+0

Oltre ai problemi di sicurezza, 'eval' è inefficiente e impedisce il funzionamento di molti ottimizzatori e minificatori JavaScript. Se stai usando 'eval' per qualcosa di diverso dall'analisi di JSON, probabilmente c'è un modo migliore per farlo. –

5

Le risposte precedenti tutti affermano che è possibile effettuare le seguenti operazioni:

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

Tuttavia, questo non funziona in entrambi Chrome o FF, perché ciò che sta facendo valutata 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]); 
+2

'eval' considerato dannoso. –

+0

Ho notato che questa versione forniva lo sfasamento del fuso orario: UTC ..... Esempio: mar 20 settembre 09:44:41 EDT 2011. Altre versioni non avevano l'EDT. Grazie mucca. – granadaCoder

10

la conversione dal 1970,1,1 richiede il doppio arrotondato a zero cifre decimali che penso

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 usano

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

bel trucco per la 'nuova data (+ data.replace (/ \ D/g, ''));' – kite