【问题标题】:How to convert JavascriptSerializer serialized DateTime string to Javascript Date object如何将 JavascriptSerializer 序列化的 DateTime 字符串转换为 Javascript Date 对象
【发布时间】:2013-04-16 08:29:00
【问题描述】:

在使用JavaScriptSerializer 序列化具有DateTime 字段的对象后,我看到DateTime 字段如下所示:

EffectiveFrom: "/Date(1355496152000)/"

如何将此字符串转换为 Javascript 日期对象?

【问题讨论】:

标签: javascript asp.net


【解决方案1】:

更新:此答案可能不适用于所有情况。请参阅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)/");

【讨论】:

  • 好主意。为什么 JavaScriptSerializer 使用 JavaScript 无法使用的格式?
  • 两个原因。首先,在创建 JSON 格式时,他们遗漏了日期文字。其次,虽然这是“可直接由 javascript 使用”,但它仅在您必须使用 eval() 并且 eval() 被认为是不好的情况下才可用,因为它可以用于跨站点脚本攻击。
  • json = Regex.Replace(json,@"\""\\/Date((-?\d+))\\/\""","new Date($1)");这个数字可能是负数
  • @Kavius 当我使用该技术时,我无法让我的 JSON 通过验证 linter。它应该通过吗?
  • @Corgalore,正如 Zach 所指出的,这不是真正的“JSON”,而是有效的“Javascript”。它可能不会通过“JSON”验证。对于严格的 JSON 一致性,您可能会发现其他答案之一更合适。
【解决方案2】:

有一个答案可以帮助你:

Parsing Date-and-Times from JavaScript to C#

如果你想用 javascript 将日期时间字符串解析为日期时间值,你必须像这样使用“新日期”:

var data = new Date("1355496152000");

【讨论】:

    【解决方案3】:
    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);
    

    【讨论】:

      【解决方案4】:

      这有点小题大做,但上面的内容对于我想要实现的目标来说似乎并不优雅,所以在我序列化的对象定义中,我这样做了:

              /// <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
      }
      

      【讨论】:

        猜你喜欢
        • 2011-10-19
        • 2012-11-27
        • 1970-01-01
        • 2023-04-06
        • 2020-10-05
        • 2016-01-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多