【问题标题】:ASP.NET MVC JsonResult Date FormatASP.NET MVC JsonResult 日期格式
【发布时间】:2010-10-18 02:25:11
【问题描述】:

我有一个控制器操作,它有效地简单地返回我的模型的 JsonResult。所以,在我的方法中,我有如下内容:

return new JsonResult(myModel);

这很好用,除了一个问题。模型中有一个日期属性,这似乎在 Json 结果中返回,如下所示:

"\/Date(1239018869048)\/"

我应该如何处理日期以便它们以我需要的格式返回?或者我如何在脚本中处理上面的这种格式?

【问题讨论】:

标签: javascript asp.net-mvc json


【解决方案1】:

只是为了扩展casperOne's answer

JSON spec 不考虑日期值。 MS 必须打个电话,他们选择的路径是利用字符串的 javascript 表示中的一个小技巧:字符串文字“/”与“\/”相同,而字符串文字将 never 序列化为“\/”(甚至“\/”也必须映射到“\\/”)。

请参阅http://msdn.microsoft.com/en-us/library/bb299886.aspx#intro_to_json_topic2 以获得更好的解释(向下滚动到“从 JavaScript 文字到 JSON”)

JSON 的痛点之一是 缺少日期/时间文字。许多 人们感到惊讶和失望 当他们第一次学习这个 遇到 JSON。简单的解释 (安慰与否)因为没有 日期/时间文字是 JavaScript 也从未有过:支持 JavaScript 中的日期和时间值是 完全通过日期提供 目的。大多数应用程序使用 JSON 因此,通常作为一种数据格式 倾向于使用字符串或 表示日期和时间的数字 价值观。如果使用字符串,您可以 通常希望它在 ISO 中 8601 格式。如果使用数字, 相反,那么值通常是 表示数量 通用协调的毫秒数 自纪元以来的时间 (UTC),其中纪元是 定义为 1970 年 1 月 1 日午夜 (世界标准时间)。再说一次,这只是 约定而不是 JSON 的一部分 标准。如果您正在交换数据 使用另一个应用程序,您将 需要检查其文档以查看 它如何编码日期和时间值 在 JSON 文字中。例如, 微软的 ASP.NET AJAX 既不使用 所描述的约定。相当, 它将 .NET DateTime 值编码为 JSON 字符串,其中的内容 字符串是 /Date(ticks)/ 并且在哪里 ticks 表示自以来的毫秒数 纪元(UTC)。所以在 1989 年 11 月 29 日, 凌晨 4:55:30,UTC 编码为 "\/日期(628318530718)\/".

一个解决方案就是把它解析出来:

value = new Date(parseInt(value.replace("/Date(", "").replace(")/",""), 10));

但是我听说有一个设置可以让序列化程序使用new Date(xxx) 语法输出DateTime 对象。我会试着把它挖出来。


JSON.parse() 的第二个参数接受一个reviver 函数,其中规定了在返回之前最初是如何产生值的。

以下是日期示例:

var parsed = JSON.parse(data, function(key, value) {
  if (typeof value === 'string') {
    var d = /\/Date\((\d*)\)\//.exec(value);
    return (d) ? new Date(+d[1]) : value;
  }
  return value;
});

查看JSON.parse()的文档

【讨论】:

  • 谢谢,但是解析会去哪里?
  • 我发布的代码是 JavaScript。你可以把它放在你的客户端代码中。
  • 可以将js缩短为new Date(parseInt(dateString.replace(/\/Date\((\d+)\)\//gi, "$1")))
  • 事实上,正则表达式作为 replace(/\/Date\((-?\d+)\)\//gi, "$1") 更正确,因为日期可能表示为 - ve号也
  • @HarshilShah 这是parseInt() 的第二个参数。它告诉函数提取以 10 为底的数字系统中的整数。这是一个基数。如果你把8放在那里,它会提取一个八进制数。
【解决方案2】:

这是我的 Javascript 解决方案 - 非常类似于 JPot 的解决方案,但更短(并且可能更快一点):

value = new Date(parseInt(value.substr(6)));

“value.substr(6)”取出“/Date(”部分,parseInt函数忽略末尾出现的非数字字符。

编辑:我故意省略了基数(parseInt 的第二个参数);见my comment below。另外,请注意,ISO-8601 日期比这种旧格式更受欢迎——因此这种格式通常不应用于新的开发。

对于 ISO-8601 格式的 JSON 日期,只需将字符串传递给 Date 构造函数:

var date = new Date(jsonDate); //no ugly parsing needed; full timezone support

【讨论】:

  • +1 我采用了您的简单解决方案并将其放入递归函数中。见这里:danielsadventure.info/dotnetdatetime
  • 在使用 parseInt 时,您应该始终指定一个基数。 【来源】:developer.mozilla.org/en-US/docs/JavaScript/Reference/…
  • @JohnZabroski:每条规则都有其例外。 .NET 日期序列化程序 从不 返回带有前导零的整数,因此我们可以放心地省略基数。
  • 我们拥有几乎相同的东西。我们使用value.substr(6, 13) 删除其他非数字字符。但如果你这样做,1938 年 4 月 26 日之前的所有日期都是无效的!我们不知道parseInt 会忽略非数字字符。谢谢!
  • @JohnZabroski—parseInt 应忽略 ECMAScript ed 5 (2011) 的前导零。
【解决方案3】:

有很多答案可以在客户端处理它,但如果需要,您可以更改输出服务器端。

有几种方法可以解决这个问题,我将从基础开始。您必须继承 JsonResult 类并覆盖 ExecuteResult 方法。从那里您可以采取几种不同的方法来更改序列化。

方法一: 默认实现使用JsonScriptSerializer。如果您查看文档,您可以使用 RegisterConverters 方法添加自定义JavaScriptConverters。但这有一些问题: JavaScriptConverter 序列化为字典,即它需要一个对象并序列化为 Json 字典。为了使对象序列化为字符串,它需要一些技巧,请参阅post。这个特殊的 hack 也会转义字符串。

public class CustomJsonResult : JsonResult
{
    private const string _dateFormat = "yyyy-MM-dd HH:mm:ss";

    public override void ExecuteResult(ControllerContext context)
    {
        if (context == null)
        {
            throw new ArgumentNullException("context");
        }

        HttpResponseBase response = context.HttpContext.Response;

        if (!String.IsNullOrEmpty(ContentType))
        {
            response.ContentType = ContentType;
        }
        else
        {
            response.ContentType = "application/json";
        }
        if (ContentEncoding != null)
        {
            response.ContentEncoding = ContentEncoding;
        }
        if (Data != null)
        {
            JavaScriptSerializer serializer = new JavaScriptSerializer();

            // Use your custom JavaScriptConverter subclass here.
            serializer.RegisterConverters(new JavascriptConverter[] { new CustomConverter });

            response.Write(serializer.Serialize(Data));
        }
    }
}

方法 2(推荐): 第二种方法是从重写的 JsonResult 开始,然后使用另一个 Json 序列化程序,在我的例子中是 Json.NET 序列化程序。这不需要方法 1 的技巧。这是我对 JsonResult 子类的实现:

public class CustomJsonResult : JsonResult
{
    private const string _dateFormat = "yyyy-MM-dd HH:mm:ss";

    public override void ExecuteResult(ControllerContext context)
    {
        if (context == null)
        {
            throw new ArgumentNullException("context");
        }

        HttpResponseBase response = context.HttpContext.Response;

        if (!String.IsNullOrEmpty(ContentType))
        {
            response.ContentType = ContentType;
        }
        else
        {
            response.ContentType = "application/json";
        }
        if (ContentEncoding != null)
        {
            response.ContentEncoding = ContentEncoding;
        }
        if (Data != null)
        {
            // Using Json.NET serializer
            var isoConvert = new IsoDateTimeConverter();
            isoConvert.DateTimeFormat = _dateFormat;
            response.Write(JsonConvert.SerializeObject(Data, isoConvert));
        }
    }
}

用法示例:

[HttpGet]
public ActionResult Index() {
    return new CustomJsonResult { Data = new { users=db.Users.ToList(); } };
}

其他学分: James Newton-King

【讨论】:

  • 那么其他格式如货币、身份证号码、电话等呢?从 ModelMetadata 获取这些格式并使用它们将 Models 序列化为 Json 不是更好的方法吗?怎么样?
  • 这是最好的解决方案(Perishable Dave 的回答)。服务器负责提供正确的日期格式。还有一个自定义的 JsonResult 提供了更多的好处和控制。我建议实现一个辅助方法“CustomJson(data)”,在存在“Json(data)”时实例化 CustomJsonResult,该方法用其数据实例化 JsonResult。
  • 如果您使用这些方法中的任何一种,则需要进行更正 - 第一行应该是: private const string _dateFormat = "yyyy-MM-ddTHH:mm:ss";我添加了“T”。
【解决方案4】:

Moment.js 是一个广泛的日期时间库,也支持这一点。 http://momentjs.com/docs/#/parsing/asp-net-json-dates/

例如:时刻(“/日期(1198908717056-0700)/”)

这可能会有所帮助。 plunker output

【讨论】:

  • 首先下载 moment.js 文件。在你的项目中添加而不是使用 moment("json_date_string_value").format('appropriate format'); 你可以在 momet.js 页面上看到不同的格式值
【解决方案5】:

我发现创建一个新的 JsonResult 并返回它并不令人满意 - 必须将所有对 return Json(obj) 的调用替换为 return new MyJsonResult { Data = obj } 是一种痛苦。


所以我想,为什么不直接使用ActionFilter 劫持JsonResult

public class JsonNetFilterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        if (filterContext.Result is JsonResult == false)
        {
            return;
        }

        filterContext.Result = new JsonNetResult(
            (JsonResult)filterContext.Result);
    }

    private class JsonNetResult : JsonResult
    {
        public JsonNetResult(JsonResult jsonResult)
        {
            this.ContentEncoding = jsonResult.ContentEncoding;
            this.ContentType = jsonResult.ContentType;
            this.Data = jsonResult.Data;
            this.JsonRequestBehavior = jsonResult.JsonRequestBehavior;
            this.MaxJsonLength = jsonResult.MaxJsonLength;
            this.RecursionLimit = jsonResult.RecursionLimit;
        }

        public override void ExecuteResult(ControllerContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }

            var isMethodGet = string.Equals(
                context.HttpContext.Request.HttpMethod, 
                "GET", 
                StringComparison.OrdinalIgnoreCase);

            if (this.JsonRequestBehavior == JsonRequestBehavior.DenyGet
                && isMethodGet)
            {
                throw new InvalidOperationException(
                    "GET not allowed! Change JsonRequestBehavior to AllowGet.");
            }

            var response = context.HttpContext.Response;

            response.ContentType = string.IsNullOrEmpty(this.ContentType) 
                ? "application/json" 
                : this.ContentType;

            if (this.ContentEncoding != null)
            {
                response.ContentEncoding = this.ContentEncoding;
            }

            if (this.Data != null)
            {
                response.Write(JsonConvert.SerializeObject(this.Data));
            }
        }
    }
}

这可以应用于任何返回 JsonResult 的方法,以使用 JSON.Net:

[JsonNetFilter]
public ActionResult GetJson()
{
    return Json(new { hello = new Date(2015, 03, 09) }, JsonRequestBehavior.AllowGet)
}

它会响应

{"hello":"2015-03-09T00:00:00+00:00"}

随心所欲!


如果您不介意在每次请求时调用is 比较,您可以将其添加到您的FilterConfig

// ...
filters.Add(new JsonNetFilterAttribute());

您的所有 JSON 现在都将使用 JSON.Net 而不是内置的 JavaScriptSerializer 进行序列化。

【讨论】:

  • 这是唯一一个提供可靠方法(可以设置为全局或粒度)而没有奇怪的 javascript 内联的答案。我可以投票两次吗?
【解决方案6】:

使用 jQuery 自动转换日期与$.parseJSON

注意:这个答案提供了一个 jQuery 扩展,添加了自动 ISO 和 .net 日期格式支持。

由于您使用的是 Asp.net MVC,我怀疑您在客户端使用的是 jQuery。我建议您阅读this blog post,其中包含如何使用$.parseJSON 为您自动转换日期的代码。

代码支持您提到的 Asp.net 格式的日期以及 ISO 格式的日期。所有日期都将使用$.parseJSON()自动为您格式化。

【讨论】:

  • 起初我认为这种方法效果很好。 (有关如何在 $.ajaxSetup() 中注册转换器,请参阅文章末尾的 cmets)但是,此解决方案的一个很大的缺点是它不支持 Epoc (1970) 之前的日期.....所以现在我已经决定放弃 .asmx 文件并切换到更好地格式化日期的 WebAPI(使用 JSON.NET),并且会规避所有这些麻烦。
【解决方案7】:

客户端和服务器之间的 Ajax 通信通常涉及 JSON 格式的数据。虽然 JSON 适用于字符串、数字和布尔值,但由于 ASP.NET 序列化它们的方式,它可能会给日期带来一些困难。由于它对日期没有任何特殊表示,因此它们被序列化为纯字符串。 作为一种解决方案,ASP.NET Web 窗体和 MVC 的默认序列化机制以特殊形式序列化日期 - /Date(ticks)/- 其中 ticks 是自 1970 年 1 月 1 日以来的毫秒数。

这个问题可以通过两种方式解决:

客户端

将接收到的日期字符串转换为数字,并使用日期类的构造函数,以刻度为参数创建一个日期对象。

function ToJavaScriptDate(value) {
  var pattern = /Date\(([^)]+)\)/;
  var results = pattern.exec(value);
  var dt = new Date(parseFloat(results[1]));
  return (dt.getMonth() + 1) + "/" + dt.getDate() + "/" + dt.getFullYear();
}

服务器端

之前的解决方案使用客户端脚本将日期转换为 JavaScript 日期对象。您还可以使用以您选择的格式序列化 .NET DateTime 实例的服务器端代码。 要完成此任务,您需要创建自己的 ActionResult,然后按照您想要的方式序列化数据。

参考: http://www.developer.com/net/dealing-with-json-dates-in-asp.net-mvc.html

【讨论】:

    【解决方案8】:

    我遇到了同样的问题,我没有返回实际的日期值,而是使用了 ToString("dd MMM yyyy") 。然后在我的 javascript 中,我使用了 new Date(datevalue),其中 datevalue 可能是“2009 年 1 月 1 日”。

    【讨论】:

    • 这应该有更多的赞成票。它至少和最受好评的一样好。比切弦还要优雅一点。就个人而言,我使用了它,但没有在前端重新创建日期对象,因为我只需要显示它,所以我只显示了(略有不同的)格式化字符串。感谢您的提示,@Joe!
    • 它确实打破了关注点的分离,即将日期如何显示在后端的前端。但是,嗯,它仍然更优雅。
    • 为什么不使用不那么脆弱的东西,比如ToString("o")
    • "dd MMM yyyy" 不被 ECMA-262 支持,所以你不应该期望内置解析器来解析它
    【解决方案9】:

    看到这个帖子:

    http://forums.asp.net/p/1038457/1441866.aspx#1441866

    基本上,虽然Date() 格式是有效的 javascript,但它不是有效的 JSON(存在差异)。如果您想要旧格式,您可能必须创建一个外观并自己转换值,或者找到一种方法来获取JsonResult 中您的类型的序列化程序并让它使用自定义格式的日期。

    【讨论】:

    • 认为你的意思是“虽然新的 Date() 格式是有效的 javascript”[注意“new”关键字]?
    【解决方案10】:

    不是最优雅的方式,但这对我有用:

    var ms = date.substring(6, date.length - 2);
    var newDate = formatDate(ms);
    
    
    function formatDate(ms) {
    
        var date = new Date(parseInt(ms));
        var hour = date.getHours();
        var mins = date.getMinutes() + '';
        var time = "AM";
    
        // find time 
        if (hour >= 12) {
            time = "PM";
        }
        // fix hours format
        if (hour > 12) {
            hour -= 12;
        }
        else if (hour == 0) {
            hour = 12;
        }
        // fix minutes format
        if (mins.length == 1) {
            mins = "0" + mins;
        }
        // return formatted date time string
        return date.getMonth() + 1 + "/" + date.getDate() + "/" + date.getFullYear() + " " + hour + ":" + mins + " " + time;
    }
    

    【讨论】:

      【解决方案11】:

      我一直在努力解决这个问题,因为上述答案都没有真正帮助我。我正在使用 jquery 周历,需要我的日期在服务器上和页面上本地获取时区信息。经过一番挖掘,我想出了一个可能对其他人有所帮助的解决方案。

      我正在使用 asp.net 3.5,与 2008、asp.net MVC 2 和 jquery 周历相比,

      首先,我使用的是 Steven Levithan 编写的库,它有助于在客户端处理日期,Steven Levithan's date library。 isoUtcDateTime 格式非常适合我的需要。在我的 jquery AJAX 调用中,我使用带有 isoUtcDateTime 格式的库提供的格式函数,当 ajax 调用命中我的操作方法时,日期时间类型设置为本地并反映服务器时间。

      当我通过 AJAX 将日期发送到我的页面时,我通过使用 "ddd, dd MMM yyyy HH':'mm':'ss 'GMT'zzzz" 格式化日期来将它们作为文本字符串发送。这种格式很容易在客户端使用

      var myDate = new Date(myReceivedDate);
      

      这是我的完整解决方案减去 Steve Levithan 的源代码,您可以下载:

      控制器:

      public class HomeController : Controller
      {
          public const string DATE_FORMAT = "ddd, dd MMM yyyy HH':'mm':'ss 'GMT'zzzz";
      
          public ActionResult Index()
          {
              ViewData["Message"] = "Welcome to ASP.NET MVC!";
      
              return View();
          }
      
          public ActionResult About()
          {
              return View();
          }
      
      
          public JsonResult GetData()
          {
              DateTime myDate = DateTime.Now.ToLocalTime();
      
              return new JsonResult { Data = new { myDate = myDate.ToString(DATE_FORMAT) } };
          }
      
          public JsonResult ReceiveData(DateTime myDate)
          {
              return new JsonResult { Data = new { myDate = myDate.ToString(DATE_FORMAT) } };
          }
      }
      

      Javascript:

      <script type="text/javascript">
      
      function getData() {
          $.ajax({
              url: "/Home/GetData",
              type: "POST",
              cache: "false",
              dataType: "json",
              success: function(data) {
                  alert(data.myDate);
                  var newDate = cleanDate(data.myDate);
                  alert(newDate);
                  sendData(newDate);
              }
          });
      } 
      
      function cleanDate(d) {
          if (typeof d == 'string') {
              return new Date(d) || Date.parse(d) || new Date(parseInt(d));
          }
          if (typeof d == 'number') {
              return new Date(d);
          }
          return d;
      }
      
      function sendData(newDate) {
          $.ajax({
              url: "/Home/ReceiveData",
              type: "POST",
              cache: "false",
              dataType: "json",
              data:
              {
                  myDate: newDate.format("isoUtcDateTime")
              },
              success: function(data) {
                  alert(data.myDate);
                  var newDate = cleanDate(data.myDate);
                  alert(newDate);
              }
          });
      }
      
      // bind myButton click event to call getData
      $(document).ready(function() {
          $('input#myButton').bind('click', getData);
      });
      </script>
      

      我希望这个快速示例可以帮助其他与我遇到相同情况的人。目前,它似乎与 Microsoft JSON 序列化配合得很好,并且可以使我的日期跨时区保持正确。

      【讨论】:

      • 如果您可以指定日期的格式,那么您应该使用 ISO 8601 扩展,因为这是 ECMA-262 需要支持的唯一格式。
      【解决方案12】:

      在 knockoutjs 中处理日期的更好方法是使用矩库并像老板一样处理日期。您可以轻松处理 /Date(-62135578800000)/ 之类的日期。无需费心如何在控制器中序列化日期。

      function jsonToDate(date,format) {
         return moment(date).format(format);
      }
      

      像这样使用它

      var formattedDate = jsonToDate(date,'MM/DD/YYYY')
      

      momentjs 支持多种日期时间格式和日期实用功能。

      【讨论】:

        【解决方案13】:

        格式化查询中的日期。

        var _myModel = from _m in model.ModelSearch(word)
            select new { date = ((DateTime)_m.Date).ToShortDateString() };
        

        此解决方案的唯一问题是,如果任何日期值为空,您将不会得到任何结果。为了解决这个问题,您可以在选择忽略日期空值的日期之前在查询中放置条件语句,或者您可以设置查询以获取所有结果,然后使用 foreach 循环遍历所有这些信息并分配一个值在您执行 SELECT new 之前,所有为空的日期。

        两者的例子:

        var _test = from _t in adc.ItemSearchTest(word)
                                where _t.Date != null
                                select new { date = ((DateTime)_t.Date).ToShortDateString() };
        

        第二个选项完全需要另一个查询,因此您可以将值分配给所有空值。这和 foreach 循环必须在您选择值的查询之前。

        var _testA = from _t in adc.ItemSearchTest(word)
                                 select _i;
        
                    foreach (var detail in _testA)
                    {
                        if (detail.Date== null)
                        {
                            detail.Date= Convert.ToDateTime("1/1/0001");
                        }
                    }
        

        只是一个我发现比所有 javascript 示例更容易的想法。

        【讨论】:

          【解决方案14】:

          你可以使用这个方法:

          String.prototype.jsonToDate = function(){
              try{
                  var date;
                  eval(("date = new " + this).replace(/\//g,''));
                  return date;
              } 
              catch(e){
                  return new Date(0);
              }
          };
          

          【讨论】:

            【解决方案15】:

            这是我编写的一些 JavaScript 代码,它根据从 ASP.NET MVC 传递的日期设置 &lt;input type="date"&gt; 值。

            var setDate = function(id, d) {
              if (d !== undefined && d !== null) {
                var date = new Date(parseInt(d.replace("/Date(", "").replace(")/", ""), 10));
                var day = ('0' + date.getDate()).slice(-2);
                var month = ('0' + (date.getMonth() + 1)).slice(-2);
                var parsedDate = date.getFullYear() + "-" + (month) + "-" + (day);
                $(id).val(parsedDate);
              }
            };
            

            你这样调用这个函数:

            setDate('#productCommissionStartDate', data.commissionStartDate);
            

            commissionStartDate 是 MVC 传递的 JSON 日期。

            【讨论】:

              【解决方案16】:

              在您的页面中添加 jquery ui 插件。

              function JsonDateFormate(dateFormate, jsonDateTime) {
                  return $.datepicker.formatDate(dateFormate, eval('new ' + jsonDateTime.slice(1, -1)));
              };
              

              【讨论】:

                【解决方案17】:

                并非没有,但还有另一种方式。首先,构建您的 LINQ 查询。然后,构建枚举结果的查询并应用适合您的任何类型的格式。

                var query = from t in db.Table select new { t.DateField };
                var result = from c in query.AsEnumerable() select new { c.DateField.toString("dd MMM yyy") };
                

                我不得不说,额外的步骤很烦人,但效果很好。

                【讨论】:

                  【解决方案18】:

                  对我有用的是创建一个包含日期属性作为字符串的视图模型。从域模型中分配 DateTime 属性,并在将值分配给 viewmodel 时调用 date 属性上的 .ToString()。

                  来自 MVC 操作方法的 JSON 结果将以与视图兼容的格式返回日期。

                  查看模型

                  public class TransactionsViewModel
                  {
                      public string DateInitiated { get; set; }
                      public string DateCompleted { get; set; }
                  }
                  

                  领域模型

                  public class Transaction{
                     public DateTime? DateInitiated {get; set;}
                     public DateTime? DateCompleted {get; set;}
                  }
                  

                  控制器动作方法

                  public JsonResult GetTransactions(){
                  
                  var transactions = _transactionsRepository.All;
                          var model = new List<TransactionsViewModel>();
                  
                          foreach (var transaction in transactions)
                          {
                              var item = new TransactionsViewModel
                              {
                                  ...............
                                  DateInitiated = transaction.DateInitiated.ToString(),
                                  DateCompleted = transaction.DateCompleted.ToString(),
                              };
                  
                              model.Add(item);
                          }
                          return Json(model, JsonRequestBehavior.AllowGet);
                  }
                  

                  【讨论】:

                    【解决方案19】:

                    重写控制器 Json/JsonResult 以返回 JSON.Net:

                    This works a treat

                    【讨论】:

                      【解决方案20】:

                      烦人,不是吗?

                      我的解决方案是更改我的 WCF 服务,使其以更易读(非 Microsoft)格式返回 DateTimes。请注意下面的“UpdateDateOriginal”,这是 WCF 的默认日期格式,以及我的“UpdateDate”,它被格式化为更易读的格式。

                      这是怎么做的:

                      Changing WCF date format

                      希望这会有所帮助。

                      【讨论】:

                        【解决方案21】:

                        我发现这是在服务器端更改它的最简单方法。

                        using System.Collections.Generic;
                        using System.Web.Mvc;
                        using Newtonsoft.Json;
                        using Newtonsoft.Json.Converters;
                        using Newtonsoft.Json.Serialization;
                        
                        namespace Website
                        {
                            /// <summary>
                            /// This is like MVC5's JsonResult but it uses CamelCase and date formatting.
                            /// </summary>
                            public class MyJsonResult : ContentResult
                            {
                                private static readonly JsonSerializerSettings Settings = new JsonSerializerSettings
                                {
                                    ContractResolver = new CamelCasePropertyNamesContractResolver(),
                                    Converters = new List<JsonConverter> { new StringEnumConverter() }
                                };
                        
                                public FindersJsonResult(object obj)
                                {
                                    this.Content = JsonConvert.SerializeObject(obj, Settings);
                                    this.ContentType = "application/json";
                                }
                            }
                        }
                        

                        【讨论】:

                          【解决方案22】:

                          我在 JSON 日期方面遇到了许多问题,并决定通过解决 SQL 中的日期问题来解决这个问题。将日期格式更改为字符串格式

                          select flddate from tblName
                          
                          select flddate, convert(varchar(12), flddate, 113) as fldDateStr from tblName
                          

                          通过使用 fldDateStr,问题消失了,我仍然可以使用日期字段进行排序或其他目的。

                          【讨论】:

                            【解决方案23】:

                            它返回服务器日期格式。您需要定义自己的函数。

                            function jsonDateFormat(jsonDate) {
                              // Changed data format;
                              return (new Date(parseInt(jsonDate.substr(6)))).format("mm-dd-yyyy / h:MM tt");
                            };
                            

                            【讨论】:

                              【解决方案24】:

                              0

                              在你的cshtml中,

                              <tr ng-repeat="value in Results">                
                               <td>{{value.FileReceivedOn | mydate | date : 'dd-MM-yyyy'}} </td>
                              </tr>
                              

                              在你的 JS 文件中,可能是 app.js,

                              在 app.controller 之外,添加以下过滤器。

                              这里的“mydate”是您为解析日期而调用的函数。这里的“app”是包含 angular.module 的变量

                              app.filter("mydate", function () {
                                  var re = /\/Date\(([0-9]*)\)\//;
                                  return function (x) {
                                      var m = x.match(re);
                                      if (m) return new Date(parseInt(m[1]));
                                      else return null;
                                  };
                              });
                              

                              【讨论】:

                              • 这对于 angularjs 来说非常具体,并不是所有人都使用它,但这对我有用,谢谢。
                              【解决方案25】:

                              最简单的一个:

                              var milisegundos = parseInt(data.replace("/Date(", "").replace(")/", ""));
                              var newDate = new Date(milisegundos).toLocaleDateString("en-UE");

                              【讨论】:

                                猜你喜欢
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                • 2014-04-28
                                相关资源
                                最近更新 更多