Comment analyser JSON pour recevoir un objet Date en JavaScript?

j'ai un morceau de JSON suivant:

/Date(1293034567877)/

qui est le résultat de ce code. net:

var obj = DateTime.Now;
var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
serializer.Serialize(obj).Dump();

maintenant, le problème auquel je suis confronté est de savoir comment créer un objet Date à partir de cela en JavaScript. Tout ce que j'ai pu trouver était la solution incroyable regex (beaucoup contenant des bogues).

il est difficile de croire qu'il n'y a pas de solution élégante car tout cela est dans JavaScrip, je veux dire le code JavaScript essayant de lire JSON (JavaScript Object Notation) qui est supposé être un code JavaScript et à ce moment il s'avère que ce N'est pas parce que JavaScript ne peut pas faire un bon travail ici.

j'ai également vu quelques solutions d'évaluation que je ne pouvais pas faire fonctionner (en plus d'être pointé comme une menace de sécurité).

est-il vraiment impossible de le faire de manière élégante?

question similaire sans réponse réelle:

comment analyser ASP.NET JSON Date format avec GWT

93
demandé sur Community 2010-12-22 20:13:00

16 réponses

il n'y a pas de représentation JSON standard des dates. Vous devez faire ce que @jAndy a suggéré et ne pas sérialiser un DateTime du tout; il suffit d'envoyer une chaîne de date RFC 1123 ToString("r") ou un nombre de secondes-De-Unix-epoch, ou quelque chose d'autre que vous pouvez utiliser dans le JavaScript pour construire un Date .

42
répondu Jacob 2010-12-22 17:46:10

The JSON.la fonction parse accepte une fonction de réveil DateTime optionnelle. Vous pouvez utiliser une fonction comme ceci:

dateTimeReviver = function (key, value) {
    var a;
    if (typeof value === 'string') {
        a = /\/Date\((\d*)\)\//.exec(value);
        if (a) {
            return new Date(+a[1]);
        }
    }
    return value;
}

puis appeler

JSON.parse(somejsonstring,dateTimeReviver)

Et de vos dates sortira droit

106
répondu Tim 2013-01-24 19:44:01

Cette réponse de Roy Bricoler ici :

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

, Comme il dit: La fonction substr, prend le "/Date(" partie, et la fonction parseInt obtient le nombre entier et l'ignore ")/" à la fin. Le nombre résultant est passé dans le constructeur de Date.

une autre option est de simplement formater vos informations correctement du côté ASP de sorte que JavaScript puisse facilement les lire. Considérer faire ceci pour vos dates:

DateTime.Now()

qui devrait retourner un format comme celui-ci:

7/22/2008 12:11:04 PM

si vous passez cela dans un JavaScript Date constructeur comme ceci:

var date = new Date('7/22/2008 12:11:04 PM');

la variable date contient maintenant cette valeur:

Tue Jul 22 2008 12:11:04 GMT-0700 (Pacific Daylight Time)

naturellement, vous pouvez formater cet objet DateTime en n'importe quelle sorte de chaîne/int que le constructeur js Date accepte.

42
répondu treeface 2017-05-23 11:54:58

si vous utilisez la date JavaScript style ISO8601 dans JSON, vous pouvez utiliser ceci, à partir de MDN

var jsonDate = (new Date()).toJSON();
var backToDate = new Date(jsonDate);
console.log(jsonDate); //2015-10-26T07:46:36.611Z
12
répondu LeeGee 2016-02-04 15:30:36

Quel est le problème avec:

new Date(1293034567877);

Cela renvoie pour moi "Mer 22 Déc 2010 16:16:07 GMT+0000 (GMT)".

ou avez-vous besoin d'obtenir le numéro du json?

6
répondu Psytronic 2010-12-22 17:17:12

vous pouvez convertir la Date JSON en format de date normal en JavaScript.

var date = new Date(parseInt(jsonDate.substr(6)));
4
répondu ViPuL5 2017-03-20 06:31:13

je sais que c'est un fil très ancien, mais je souhaite poster ceci pour aider ceux qui se cognent dans ce comme je l'ai fait.

si vous ne vous souciez pas d'utiliser un script tiers, vous pouvez utiliser moment, js Ensuite, vous pouvez utiliser .format() pour formater ce que vous voulez.

2
répondu Eman 2014-06-30 15:05:26

AngularJS ne pouvait pas non plus Parser .NET JSON date /Date(xxxxxxxxxxxxx)/ string..

j'ai mis de côté cette question en formatant la date à sa représentation de chaîne ISO 8601 au lieu de décharger l'objet Date directement...

voici un échantillon de ASP.NET code MVC..

return Json(new { 
  date : DateTime.Now.ToString("O") //ISO 8601 Angular understands this format
});

j'ai essayé RFC 1123 mais ça ne marche pas.. Angular le traite comme une chaîne de caractères au lieu d'une Date.

return Json(new { 
  date : DateTime.Now.ToString("R") //RFC 1123 Angular won't parse this
});
1
répondu Rosdi Kasim 2016-01-25 05:43:56

Je n'ai pas utilisé .Net pour ce genre de choses. Si vous avez pu le faire imprimer quelque chose comme ce qui suit, ça devrait marcher.

Note, sauf si vous analysez que JSON string par d'autres moyens ou seulement s'attendre à ce que les utilisateurs aient des browers modernes avec un analyseur JSON intégré, vous devez utiliser un framework JS ou JSON2 pour analyser la chaîne JSON émise par le serveur dans un objet JSON réel.

// JSON received from server is in string format
var jsonString = '{"date":1251877601000}';

//use JSON2 or some JS library to parse the string
var jsonObject =  JSON.parse( jsonString );

//now you have your date!
alert( new Date(jsonObject.date) );

Lien Wiki

navigateurs modernes, tels que Firefox 3.5 et Internet Explorer 8, comprennent des fonctionnalités spéciales pour l'analyse JSON. Comme le support natif du navigateur est plus efficace et sûr que eval(), il est prévu que le support natif JSON sera inclus dans le prochain standard ECMAScript.[6]


Lien au fichier JSON2

Live Exemple

0
répondu subhaze 2010-12-22 17:50:59

la réponse à cette question Est, utilisez nuget pour obtenir JSON.NET puis utilisez ceci dans votre JsonResult méthode:

JsonConvert.SerializeObject(/* JSON OBJECT TO SEND TO VIEW */);

à l'intérieur de votre point de vue simple de faire cela en javascript :

JSON.parse(/* Converted JSON object */)

S'il s'agit d'un appel ajax:

var request = $.ajax({ url: "@Url.Action("SomeAjaxAction", "SomeController")", dataType: "json"});
request.done(function (data, result) { var safe = JSON.parse(data); var date = new Date(safe.date); });

une fois que JSON.parse a été appelé, vous pouvez mettre la date JSON dans une instance new Date parce que JsonConvert crée une instance de temps ISO appropriée

0
répondu Callum Linington 2014-03-02 13:49:23

comme Callum l'a mentionné, pour moi, le meilleur moyen est de changer la méthode du Controller en string au lieu de JsonResult".

public string GetValues()
{
  MyObject.DateFrom = DateTime.Now;
  return JsonConvert.SerializeObject(MyObject);
}

de la méthode ajax vous pouvez faire quelque chose comme ça

 $.ajax({
 url: "/MyController/GetValues",
 type: "post",
 success: function (data) {
 var validData = JSON.parse(data);
//if you are using datepicker and you want set a format
$("#DateFrom").val($.datepicker.formatDate("dd/mm/yy", new Date(validData.DateFrom)));                                      
// if you want the date as returned
$("#DateFrom").val(new Date(validData.DateFrom))
}
});
0
répondu onixpam 2015-11-24 19:55:58

les Dates sont toujours un cauchemar. Répondant à votre vieille question, c'est peut-être la façon la plus élégante:

eval(("new " + "/Date(1455418800000)/").replace(/\//g,""))

avec eval nous convertissons notre chaîne de caractères en code javascript. Puis on enlève le " / " dans la fonction remplacer est une expression régulière. Comme nous commençons par nouveau, alors nos phrases excécuteront ceci:

new Date(1455418800000)

maintenant, une chose que j'ai commencé à utiliser il y a longtemps, ce sont les valeurs longues qui sont représentées dans les tiques... pourquoi? bien, localisation et arrêter de penser à quelle date est configuré sur chaque serveur ou chaque client. En fait, je l'utilise aussi dans les bases de données.

est peut-être en retard pour cette réponse, mais peut aider n'importe qui ici.

0
répondu Gabriel Andrés Brancolini 2016-02-14 23:23:29

en utilisant la fonction eval fonctionne juste doivent enlever la barre oblique avant à l'avant et à l'arrière.

var date1 = "/Date(25200000)/"
eval("new " + date1.substring(1, date1.length - 1));

les rendements Jeu 01 Jan 1970 00:00:00 GMT-0700 (états-unis Heure normale des rocheuses)

0
répondu vernmic 2016-10-19 00:51:07
//
// formats a .net date into a javascript compatible date
//
function FormatJsonDate(jsonDt) 
{              
    var MIN_DATE = -62135578800000; // const

    var date = new Date(parseInt(jsonDt.substr(6, jsonDt.length-8)));                                                       
    return date.toString() == new Date(MIN_DATE).toString() ? "" : (date.getMonth() + 1) + "\" + date.getDate() + "\" + date.getFullYear(); 
}
-1
répondu sunil 2012-07-18 13:36:59
function parseJsonDate(jsonDate) {

    var fullDate = new Date(parseInt(jsonDate.substr(6)));
    var twoDigitMonth = (fullDate.getMonth() + 1) + ""; if (twoDigitMonth.length == 1) twoDigitMonth = "0" + twoDigitMonth;

    var twoDigitDate = fullDate.getDate() + ""; if (twoDigitDate.length == 1) twoDigitDate = "0" + twoDigitDate;
    var currentDate = twoDigitMonth + "/" + twoDigitDate + "/" + fullDate.getFullYear();

    return currentDate;
};
-1
répondu Muzafar 2015-07-06 10:58:13
function parseJsonDate(jsonDate) {

    var fullDate = new Date(parseInt(jsonDate.substr(6)));
    var twoDigitMonth = (fullDate.getMonth() + 1) + ""; if (twoDigitMonth.length == 1) twoDigitMonth = "0" + twoDigitMonth;

    var twoDigitDate = fullDate.getDate() + ""; if (twoDigitDate.length == 1) twoDigitDate = "0" + twoDigitDate;
    var currentDate = twoDigitMonth + "/" + twoDigitDate + "/" + fullDate.getFullYear();

    return currentDate;
};

/ / utiliser cette fonction

var objDate=parseJsonDate("\/Date(1443812400000)\/");
alert(objDate);
-1
répondu Muzafar Hasan 2018-05-16 13:56:11