【发布时间】:2013-04-16 08:29:00
【问题描述】:
在使用JavaScriptSerializer 序列化具有DateTime 字段的对象后,我看到DateTime 字段如下所示:
EffectiveFrom: "/Date(1355496152000)/"
如何将此字符串转换为 Javascript 日期对象?
【问题讨论】:
标签: javascript asp.net
在使用JavaScriptSerializer 序列化具有DateTime 字段的对象后,我看到DateTime 字段如下所示:
EffectiveFrom: "/Date(1355496152000)/"
如何将此字符串转换为 Javascript 日期对象?
【问题讨论】:
标签: javascript asp.net
更新:此答案可能不适用于所有情况。请参阅JD's answer 了解可能更好的优雅解决方案。
您可以在 .Net 方面“修复”JavaScriptSerializer 的输出:
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)")
更新 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)/");
【讨论】:
有一个答案可以帮助你:
Parsing Date-and-Times from JavaScript to C#
如果你想用 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# 对日期值做了什么。将[ScriptIgnore] 添加到 DateTime 值并为解析器提供另一个输出视图应该可以解决问题。在我的情况下是这样的:
{
"DateToDispose": "1/1/2020",
"DateOfRetentionEvent": "10/1/2014",
"FullRetentionCode": "NR+5",
"RetentionEvent": "NR",
"RetentionPeriod": 5
}
【讨论】: