在Json Encoded数组中解析日期

时间:2017-02-21 16:56:32

标签: javascript json asp.net-mvc datetime

我已经构建了一个MVC网站,我将我的模型传递给视图并尝试在视图中的某些javascript中使用它:

var records = @Html.Raw(Json.Encode(Model)); 

我的目标是在自定义日历对象中使用这些记录,该对象接受对象数组作为数据源。但是,数据源需要日期变量来知道放置约会的位置等。我已经读过Json没有任何日期格式的约会。因此,从编码返回的所有日期都格式为:

/Date(1462921200000)/

对象似乎不接受这个并且视图上没有显示任何内容。在我读过的帖子中,他们已经声明您可以将日期解析回正确的格式,但这似乎只是针对个别值。

我的问题是:是否有一种简单的方法来获取我已经获得的编码对象并将日期解析为正确的格式?或者,为了做到这一点,我是否必须遍历它们?

感谢。

3 个答案:

答案 0 :(得分:1)

警告:这个答案是固执己见的。 自以为是的部分是:当您需要使用Json完成某些操作时,请使用Json.Net

namespace System.Web.MVC
{
  public static class HtmlHelperJsonExtensions
  {
    public string JsonEncode(this System.Web.MVC.HtmlHelper html, object o)
    {
      var jsonSettings = new Newtonsoft.Json.JsonSerializerSettings()
      {
        // Here you can apply a LOT of formatting, as a small example regarding dates:
        // 1 - formats dates as iso strings (probably what you want)
        DateFormatHandling = Newtonsoft.Json.DateFormatHandling.IsoDateFormat,
        // 2 - formats dates with Microsoft format (what you're experiencing)
        //DateFormatHandling = Newtonsoft.Json.DateFormatHandling.MicrosoftDateFormat,
        // 3 - formats date in a custom format as for DateTime.ToString(string) overload
        //DateFormatString = "yyyy-MM-dd"
        Formatting = Indented
      };

      var json = Newtonsoft.Json.JsonConvert.SerializeObject(o, jsonSettings);

      return html.Raw(json);
    }
  }
}

用法:

var records = @Html.JsonEncode(Model);

有关见解,请参阅优秀的Json.Net文档here

答案 1 :(得分:0)

Asp.Net MVC应用程序默认返回ISO-8601格式的日期。 您可以使用以下函数转换客户端中的值:

function ConvertDate(dateString) {
    return new Date(parseInt(dateString.replace("/Date(", "").replace(")/", ""), 10));
  }

或者您可以使用像momentjs(https://momentjs.com/docs/#/parsing/asp-net-json-date/)这样的库:

moment("/Date(1198908717056-0700)/"); // 2007-12-28T23:11:57.056-07:00

答案 2 :(得分:0)

免责声明:当我撰写此答案时,问题未被识别为ASP.NET。我认为OP要求他尚未公开的框架提供一些功能。我保留了答案,因为我认为它对于使用vanilla JavaScript进行手动解码是有效的。

可以使用简单的正则表达式

解析格式

var asText = "Date(1462921200000)";
var asDate = null;
var parsed = asText.match(/^Date\((\d+)\)$/);
if (parsed!==null) {
	asDate = new Date(+parsed[1]);
}
console.log(asDate);