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);
}
}
}
}
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"));
}
Ceci est une limitation connue avec JSON. Cette réponse pourrait vous aider, notamment:
value = new Date(parseInt(value.replace("/Date(", "").replace(")/",""), 10));
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.
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,""));
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.
Si vous utilisez à partir de Json.NET
ou Newtonsoft.Json
, consultez le lien suivant: Sérialisation des dates dans JSON
Nettoyage des chaînes légèrement plus simple avec RegEx:
var myDate = "\\/Date(1508821200000)\/";
var jsDate = new Date(parseInt(myDate.replace(/\D/g, '')));
jsonDateNow = String.Format("Date({0},{1},{2})", Date().Now.getYear(), Date().Now.getMonth() -1, Date().Now.getDay());
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.
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")");