javascript - Konvertere .NET DateTime til JSON
Mulig duplikat:
Hvordan formatere en JSON-dato?
Min webtjeneste returnerer en DateTime til et jQuery-kall. Tjenesten returnerer dataene i dette formatet:
/Date(1245398693390)/
Hvordan kan jeg konvertere dette til en JavaScript-vennlig dato?
Svar #1
Det som returneres er millisekunder siden epoken. Du kan gjøre:
var d = new Date();
d.setTime(1245398693390);
document.write(d);
For hvordan du formaterer datoen nøyaktig slik du ønsker, se full Date-referanse på http://www.w3schools.com/jsref/jsref_obj_date.asp
Du kan fjerne ikke-siffer ved enten å analysere heltallet (som foreslått her):
var date = new Date(parseInt(jsonDate.substr(6)));
Eller ved å bruke følgende regulære uttrykk (fra Tominator i kommentarene):
var jsonDate = jqueryCall(); // returns "/Date(1245398693390)/";
var re = /-?\d+/;
var m = re.exec(jsonDate);
var d = new Date(parseInt(m[0]));
Svar #2
Jeg har brukt denne metoden en stund:
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;
}
}
Hvis vi antar at du utvikler mot .NET 3.5, er det en enkel kopier/lim-inn. Du kan ellers porte det.
Du kan kapsle dette inn i et JSON-objekt, eller ganske enkelt skrive det til responsstrømmen.
På Javascript/JSON-siden konverterer du dette til en dato ved ganske enkelt å sende tickene inn i et nytt Date-objekt:
jQuery.ajax({
...
success: function(msg) {
var d = new Date(msg);
}
}
Svar #3
For å analysere datastrengen ved å bruke String.replace med bakreferanse:
var milli = "/Date(1245398693390)/".replace(/\/Date\((-?\d+)\)\//, '$1');
var d = new Date(parseInt(milli));
Svar #4
Hvis du sender en DateTime fra .Net-kode til JavaScript-kode, C#:
DateTime net_datetime = DateTime.Now;
javascript behandler det som en streng, som "/Date(1245398693390)/":
Du kan konvertere det som følger:
// convert the string to date correctly
var d = eval(net_datetime.slice(1, -1))
eller :
// convert the string to date correctly
var d = eval("/Date(1245398693390)/".slice(1, -1))
Svar #5
Hvis du har problemer med å få tilgang til tidsinformasjonen, kan du prøve noe slik som dette:
d.date = d.date.replace('/Date(', '');
d.date = d.date.replace(')/', '');
var expDate = new Date(parseInt(d.date));
Svar #6
konverteringen fra 1.1.1970 trenger at tallet rundes til null desimaler, tror jeg
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);
på klientsiden bruker jeg
new Date(+data.replace(/\D/g, ''));
