web-dev-qa-db-fra.com

La sérialisation Javascript de DateTime dans asp.net ne donne pas d'objet de date javascript

Lorsque j'analyse un DateTime dans json en .Net, il renvoie une chaîne (c'est-à-dire "\/Date(1249335194272)\/"). Comment est-ce que je le fais retourner un constructeur d'objet de date de js pas wrap dans une chaîne?

// js server code
var dteNow = <%= jsonDateNow %>;


// js rendered code
var dteNow = "\/Date(1249335477787)\/";


// C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.Script.Serialization;
using System.Web.UI.WebControls;

namespace testing{
    public partial class iTaxPrep : System.Web.UI.Page
    {
        protected string jsonDateNow;
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                jsonDateNow = new JavaScriptSerializer().Serialize(DateTime.Now);

            }
        }
    }
}
46
Your Friend Ken

Cela semble fonctionner (Merci Chris S pour l'idée). Dans le C #, faites un remplacement pour enlever le wrapper de chaîne autour de l'objet date;

    using System.Collections.Generic;
        using System.Linq;
        using System.Web;
        using System.Web.UI;
        using System.Web.Script.Serialization;
        using System.Web.Script.Services;
        using System.Web.Services;
        using System.Web.UI.WebControls;

        namespace test
        {
            [ScriptService]
            public partial class testing: System.Web.UI.Page
            {
                protected string strCaseID;
                protected string jsonCase;

                protected void Page_Load(object sender, EventArgs e)
                {
                    if (!IsPostBack)
                    {
                        strCaseID =Tools.GetQueryObject("id");
                        // get a complex object with dates, string, arrays etc.
                        jsonESHACase = new JavaScriptSerializer().Serialize(objCase.Get(strCaseID ))
                            .Replace("\"\\/Date(", "new Date(").Replace(")\\/\"", ")");
                    }
                }
            }
        }

..et après avoir supprimé les guillemets et ajouté le nouveau préfixe à Date, ce js fonctionne maintenant. Hourra!

testCase= <%= jsonESHACase %>;
    if (testCase) {
        document.write(testCase["ClosingDate"].format("MM dd yyyy"));
    }
14
Your Friend Ken

Ceci est une limitation connue avec JSON. Cette réponse pourrait vous aider, notamment:

value = new Date(parseInt(value.replace("/Date(", "").replace(")/",""), 10));
56
Chris S

Manipulation javascript simple comme ceci:

function(param){
  var date = new Date(parseInt(param.substr(6)));
  return date;
}

Transmettez la date JSON en tant que paramètre à la fonction et elle retournera une date javascript.

7
Furhan

Avec une petite manipulation de chaîne et un eval, vous pouvez créer un objet Date.

var dteNow = "\/Date(1249335477787)\/";
var dteObj = eval("new " + dteNow.replace(/\//g,""));
4
Ryan Triggs

Vous pouvez essayer ceci:

"MyField: " + string.Format("(function(y,m,d,h,mm,s){{var d=new Date(Date.UTC(y,m-1,d,h,mm,s));return d;}})({0},{1},{2},{3},{4},{5})", d.Year, d.Month, d.Day, d.Hour, d.Minute, d.Second);

Cela semble fonctionner en FF et IE.

1
Kat Lim Ruiz

Si vous utilisez à partir de Json.NET ou Newtonsoft.Json, consultez le lien suivant: Sérialisation des dates dans JSON

0

Nettoyage des chaînes légèrement plus simple avec RegEx:

var myDate = "\\/Date(1508821200000)\/";    
var jsDate = new Date(parseInt(myDate.replace(/\D/g, '')));
0
Captain Betty
jsonDateNow = String.Format("Date({0},{1},{2})", Date().Now.getYear(), Date().Now.getMonth() -1, Date().Now.getDay());
0
andres descalzo

J'ai trouvé qu'il s'agit d'une technique utile pour traiter ce problème:

http://icanmakethiswork.blogspot.co.uk/2012/04/beg-steal-or-borrow-decent-javascript.html

Il permet aux DateTimes d'être sérialisés en tant que chaînes de date ISO 8601 pouvant être utilisées avec le constructeur Date JavaScript et présentant l'avantage d'être lisibles par l'homme.

0
John Reilly

Voici une option utilisant Date.parse et DateTime.ToString:

var lowerBound = new Date(Date.parse("@Model.LowerBound.ToString("MMMM dd, yyyy")"));

Si vous avez besoin de temps, considérez ce qui suit. Je crois que cela repose sur une spécification javascript plus récente:

var lowerBound = new Date(Date.parse("@Model.LowerBound.ToUniversalTime().ToString("s")"));

Voici une option utilisant jQuery: (Je suis sûr qu'il existe un moyen d'ajouter l'heure ici)

var lowerBound = $.datepicker.parseDate('yy-mm-dd', "@Model.LowerBound.ToString("yyyy-MM-dd")");
0
Zephryl