DateTime
でフィールドを使用してオブジェクトをシリアル化した後、フィールドが次のようJavaScriptSerializer
になっていることがわかります。DateTime
EffectiveFrom: "/Date(1355496152000)/"
この文字列を Javascript Date オブジェクトに変換するにはどうすればよいですか?
DateTime
でフィールドを使用してオブジェクトをシリアル化した後、フィールドが次のようJavaScriptSerializer
になっていることがわかります。DateTime
EffectiveFrom: "/Date(1355496152000)/"
この文字列を Javascript Date オブジェクトに変換するにはどうすればよいですか?
更新:この回答は、すべての場合に適切であるとは限りません。おそらくより優れたエレガントなソリューションについては、JDの回答を参照してください。
JavaScriptSerializer
.Net 側からの出力を「修正」するだけです。
JavaScriptSerializer serializer = new JavaScriptSerializer();
var json = serializer.Serialize(this);
json = Regex.Replace(json,@"\""\\/Date\((-?\d+)\)\\/\""","new Date($1)");
return json;
これは変わるだろう
EffectiveFrom: "/Date(1355496152000)/"
に
EffectiveFrom: new Date(1355496152000)
Javascript で直接利用できるもの
編集: 負の日付に対応するように更新
編集: VB の人々のための正規表現の行は次のとおりです。
json = Regex.Replace(json, """\\/Date\((-?\d+)\)\\/""", "new Date($1)")
UPDATE 2016.11.20: javascript/json でより多くの日時処理が行われているので、正規表現を次のような単純なものに変更することをお勧めします。
json = Regex.Replace(json,@"\""\\/Date\((-?\d+)\)\\/\""","$1");
結果の値は有効な JSON であり、JavaScript 側で Date オブジェクトに変換できます。
また、moment.js ( http://momentjs.com/docs/#/parsing/ ) がこの形式を問題なく処理することも注目に値します。
moment("/Date(1198908717056-0700)/");
あなたを助けるかもしれない答えがあります:
javascript を使用して日時文字列を日時値に解析する場合は、次のように「新しい日付」を使用する必要があります。
var data = new Date("1355496152000");
var obj = { EffectiveFrom: "/Date(1355496152000)/" };
//parse the Date value and replace the property value with Date object:
var dateValue = parseInt(obj.EffectiveFrom.replace(/\/Date\((\d+)\)\//g, "$1"));
obj.EffectiveFrom = new Date(dateValue);
これはちょっとしたハックですが、上記は私が達成しようとしているものに対してエレガントではないように見えたので、シリアライズしているオブジェクト定義でこれを行いました:
/// <summary>Date of the record retention event or document date.
/// </summary>
public string DateOfRetentionEvent;
[ScriptIgnore]
public DateTime RetentionEventDate
{
get
{
return _retentionEventDate;
}
set
{
_retentionEventDate = value;
DateOfRetentionEvent = value.ToShortDateString();
}
}
要点は、少なくとも私の使用例 (逆シリアル化は発生しません) では、JSON は C# が日付値に対して何を行っているかをあまり気にしないということです。DateTime値に追加[ScriptIgnore]
し、パーサーが出力する別のビューを提供することで、うまくいくはずです。私の場合は次のようになります。
{
"DateToDispose": "1/1/2020",
"DateOfRetentionEvent": "10/1/2014",
"FullRetentionCode": "NR+5",
"RetentionEvent": "NR",
"RetentionPeriod": 5
}