Converting.NET DateTime à JSON [dupliquer]
possibilité de dupliquer:
comment formater une date JSON?
mon service web renvoie une date à un appel jQuery. Le service renvoie les données dans ce format:
/Date(1245398693390)/
Comment puis-je convertir cette date en une date compatible JavaScript?
10 réponses
Ce qui est retourné est le nombre de millisecondes depuis l'époque. Vous pourriez faire:
var d = new Date();
d.setTime(1245398693390);
document.write(d);
sur la façon de formater la date exactement comme vous voulez, voir la référence complète Date
à http://www.w3schools.com/jsref/jsref_obj_date.asp
vous pouvez dépouiller les non-chiffres en analysant l'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]));
j'utilise cette méthode depuis un certain temps:
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éveloppez contre .NET 3.5, c'est un simple copier/coller. Vous pouvez le porter autrement.
vous pouvez encapsuler ceci dans un objet JSON, ou simplement l'écrire dans le flux de réponse.
côté Javascript / JSON, vous convertissez ceci en date en passant simplement les tiques dans un nouvel objet Date:
jQuery.ajax({
...
success: function(msg) {
var d = new Date(msg);
}
}
pour analyser la chaîne de date à L'aide de la chaîne.remplacer par:
var milli = "/Date(1245398693390)/".replace(/\/Date\((-?\d+)\)\//, '');
var d = new Date(parseInt(milli));
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 comme suit:
// 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))
si vous avez de la difficulté à obtenir des informations sur l'heure, 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));
la conversion de 1970,1,1 a besoin du double arrondi à zéro décimale places 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);
du côté du client j'utilise
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()"));
alert(date.format("yyyy-MM-dd HH:mm:ss"));
alert(dateFormat(date, "yyyy-MM-dd HH:mm:ss"));
vous pouvez essayer une bibliothèque tierce comme json.net il y a de la documentation sur le site du projet. Ça dit qu'il faut un .net 3.5.
sinon il y en a un autre qui s'appelle Nii.json qui, je crois, est un port de java. J'ai trouvé un lien vers elle sur ce blog
les réponses précédentes indiquent toutes que vous pouvez faire ce qui suit:
var d = eval(net_datetime.slice(1, -1));
cependant, cela ne fonctionne ni dans Chrome ni dans FF parce que ce qui est évalué littéralement est:
// returns the current timestamp instead of the specified epoch timestamp
var d = Date([epoch timestamp]);
la bonne façon de procéder est:
var d = eval("new " + net_datetime.slice(1, -1)); // which parses to
var d = new Date([epoch timestamp]);
a pensé que je pourrais ajouter ma solution que j'ai utilisé.
si vous utilisez le System.Web.Script.Serialization.JavaScriptSerializer()
alors le temps retourné ne sera pas spécifique à votre fuseau horaire. Pour corriger cela, vous voudrez également utiliser dte.getTimezoneOffset()
pour obtenir de nouveau à votre heure correcte.
String.prototype.toDateFromAspNet = function() {
var dte = eval("new " + this.replace(/\//g, '') + ";");
dte.setMinutes(dte.getMinutes() - dte.getTimezoneOffset());
return dte;
}
maintenant, vous n'avez qu'à appeler
"/Date(1245398693390)/".toDateFromAspNet();
Ven 19 Juin 2009 00:04:53 GMT-0400 (Heure Avancée de l'est) {}