web-dev-qa-db-fra.com

Conversion de .NET DateTime en JSON

Duplicate possible:
Comment formater une date JSON?

Mon service Web renvoie un DateTime à un appel jQuery. Le service renvoie les données dans ce format:

/Date(1245398693390)/

Comment puis-je convertir cela en une date compatible avec JavaScript?

235
user76071

Ce qui est retourné est en millisecondes depuis Epoch. Vous pourriez faire:

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

Pour formater la date exactement comme vous le souhaitez, reportez-vous à la référence complète Date à l’adresse http://www.w3schools.com/jsref/jsref_obj_date.asp

Vous pouvez supprimer les non-chiffres en analysant le nombre entier ( comme suggéré ici ):

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

Ou en appliquant l'expression régulière suivante (de Tominator dans les commentaires):

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

J'utilise cette méthode depuis un moment:

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

En supposant que vous développiez contre .NET 3.5, il s’agit d’un copier/coller simple. Vous pouvez sinon le porter.

Vous pouvez l'encapsuler dans un objet JSON ou simplement l'écrire dans le flux de réponse.

Du côté Javascript/JSON, vous convertissez cela en date en passant simplement les graduations dans un nouvel objet Date:

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

Pour analyser la chaîne de date à l'aide de String.replace avec backreference:

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

Si vous passez un DateTime d'un code .Net à un code javascript, C #:

DateTime net_datetime = DateTime.Now;

javascript le traite comme une chaîne, comme "/Date(1245398693390)/":

Vous pouvez le convertir en flux:

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

ou:

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

Si vous rencontrez des difficultés pour obtenir les informations de temps, vous pouvez essayer quelque chose comme ceci:

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

la conversion de 1970,1,1 a besoin du double arrondi à zéro décimale je pense

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

côté client j'utilise

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

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

Vous pouvez essayer une bibliothèque tierce telle que json.net Il existe une documentation sur le site du projet. Il dit qu'il nécessite .net 3.5.

Sinon, il y en a un autre appelé Nii.json qui, je crois, est un portage de Java. J'ai trouvé un lien sur ce blog

6
Dave Archer

Les réponses précédentes indiquent toutes que vous pouvez effectuer les opérations suivantes:

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

Toutefois, cela ne fonctionne ni dans Chrome ni dans FF, car ce qui est littéralement évalué est:

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

La bonne façon de faire est:

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

var d = new Date([Epoch timestamp]); 
5
cowmoo

J'ai pensé ajouter la solution que j'utilisais.

Si vous utilisez la System.Web.Script.Serialization.JavaScriptSerializer(), l'heure renvoyée ne sera pas spécifique à votre fuseau horaire. Pour résoudre ce problème, vous voudrez également utiliser dte.getTimezoneOffset() pour le ramener à l'heure exacte.

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

maintenant tu appelleras

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

Vendredi 19 juin 2009 00:04:53 GMT-0400 (heure avancée de l'Est) {}

4
used2could