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

Relaterte artikler