.NetでDateTimeをjsonに解析すると、文字列が返されます(つまり、"\/Date(1249335194272)\/"
)。文字列でラップしないjs Dateオブジェクトコンストラクタを返すようにするにはどうすればよいですか?
// 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);
}
}
}
}
これは機能しているようです(Chris Sのアイデアに感謝します)。 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の日付を関数としてparamとして渡すと、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, '')));
jsonDateNow = String.Format("Date({0},{1},{2})", Date().Now.getYear(), Date().Now.getMonth() -1, Date().Now.getDay());
これは、この問題に対処するための便利な手法であることがわかりました。
http://icanmakethiswork.blogspot.co.uk/2012/04/beg-steal-or-borrow-decent-javascript.html
これにより、DateTimesをISO 8601日付文字列としてシリアル化できます。これはJavaScript Dateコンストラクターで使用でき、人間が読めるというボーナスがあります。
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")");