Когда я анализирую DateTime в json в .Net, он возвращает строку (т.е. "\/Date(1249335194272)\/"). Как сделать так, чтобы конструктор объекта js Date не переносился в строку?
"\/Date(1249335194272)\/"
// 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); } } } }
Это известное ограничение с JSON. Этот ответ может помочь вам, в частности:
value = new Date(parseInt(value.replace("/Date(", "").replace(")/",""), 10));
Это похоже на работу (спасибо Крису С. за идею). В C # сделайте замену, чтобы удалить оболочку строки вокруг объекта даты;
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(")\\/\"", ")"); } } } }
.. и после удаления кавычек и добавления нового префикса в Date этот js теперь работает. Ура!
testCase= <%= jsonESHACase %>; if (testCase) { document.write(testCase["ClosingDate"].format("MM dd yyyy")); }
Простые манипуляции с JavaScript, такие как:
function(param){ var date = new Date(parseInt(param.substr(6))); return date; }
Передайте дату JSON в качестве параметра функции, и она вернет дату javascript.
С небольшими манипуляциями со строками и eval вы можете создать объект Date
var dteNow = "\/Date(1249335477787)\/"; var dteObj = eval("new " + dteNow.replace(/\//g,""));
Вы можете попробовать это:
"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);
Это похоже на работу в FF и IE.
Немного проще очистить строку с помощью RegEx:
var myDate = "\\/Date(1508821200000)\/"; var jsDate = new Date(parseInt(myDate.replace(/\D/g, '')));
При использовании с Json.NET или Newtonsoft.Json посмотрите по этой ссылке: Сериализация дат в формате JSON
Json.NET
Newtonsoft.Json
Вот вариант с использованием Date.parse и DateTime.ToString:
var lowerBound = new Date(Date.parse("@Model.LowerBound.ToString("MMMM dd, yyyy")"));
Если вам нужно время, учтите следующее. Я полагаю, что это зависит от более новой спецификации JavaScript:
var lowerBound = new Date(Date.parse("@Model.LowerBound.ToUniversalTime().ToString("s")"));
Вот вариант использования jQuery: (я уверен, что есть способ добавить время здесь)
var lowerBound = $.datepicker.parseDate('yy-mm-dd', "@Model.LowerBound.ToString("yyyy-MM-dd")");
Я обнаружил, что это полезный метод для решения этой проблемы:
http://icanmakethiswork.blogspot.co.uk/2012/04/beg-steal-or-borrow-decent-javascript.html
Позволяет сериализовать DateTimes как строки даты ISO 8601, которые могут использоваться с конструктором JavaScript Date и имеют преимущество в том, что они удобочитаемы для человека.
Этот пример работает
JavaScriptSerializer serializer = new JavaScriptSerializer(); DateTime dt = DateTime.Now; DateTime dt1 = dt; string jsonDateNow = serializer.Serialize(dt1);