【问题标题】:How do I format a Microsoft JSON date?如何格式化 Microsoft JSON 日期?
【发布时间】:2021-09-18 17:29:26
【问题描述】:

我正在使用 jQuery 在Ajax 进行我的第一次破解。我正在将我的数据放到我的页面上,但是我在处理为 Date 数据类型返回的 JSON 数据时遇到了一些问题。基本上,我得到的字符串如下所示:

/Date(1224043200000)/

来自对 JSON 完全陌生的人 - 如何将其格式化为短日期格式?这应该在 jQuery 代码中的某个地方处理吗?我已经使用$.datepicker.formatDate() 尝试了jQuery.UI.datepicker 插件,但没有任何成功。

仅供参考:这是我在这里使用答案组合提出的解决方案:

function getMismatch(id) {
  $.getJSON("Main.aspx?Callback=GetMismatch",
    { MismatchId: id },

    function (result) {
      $("#AuthMerchId").text(result.AuthorizationMerchantId);
      $("#SttlMerchId").text(result.SettlementMerchantId);
      $("#CreateDate").text(formatJSONDate(Date(result.AppendDts)));
      $("#ExpireDate").text(formatJSONDate(Date(result.ExpiresDts)));
      $("#LastUpdate").text(formatJSONDate(Date(result.LastUpdateDts)));
      $("#LastUpdatedBy").text(result.LastUpdateNt);
      $("#ProcessIn").text(result.ProcessIn);
    }
  );

  return false;
}

function formatJSONDate(jsonDate) {
  var newDate = dateFormat(jsonDate, "mm/dd/yyyy");
  return newDate;
}

此解决方案从回调方法中获取我的对象,并使用日期格式库在页面上正确显示日期。

【问题讨论】:

  • 这可能很有趣:hanselman.com/blog/…
  • /Date(...)/ 格式特定于 Microsoft 的内置 JSON 日期格式 - 它不是任何标准的一部分,来自 Javascript 的 JSON 有一个标准:ISO 格式Javascript 指定:stackoverflow.com/a/15952652/176877 所以,这个问题特定于 Microsoft 的 JSON 日期格式。我修改了标题以澄清这一点。
  • 你在开玩笑!微软已经在 J​​SON 上打上了自己的烙印!和约会!他们什么时候能学会!
  • 在 .NET 端使用 Newtonsoft JSON 并在 JS 端使用漂亮的类型值,只需使用:github.com/RickStrahl/json.date-extensions
  • 您可以使用 JSON++ 代替 JSON。 JSON++ 与 JSON 相同,但支持 Date 等 JavaScript 类型。

标签: jquery asp.net ajax json


【解决方案1】:

eval() 不是必需的。这会正常工作:

var date = new Date(parseInt(jsonDate.substr(6)));

substr() 函数取出/Date( 部分,parseInt() 函数获取整数并忽略最后的)/。结果数字被传递到Date 构造函数中。


我故意省略了基数(parseInt 的第二个参数);见my comment below

另外,我完全同意Rory's comment:ISO-8601 日期比这种旧格式更受欢迎 - 所以这种格式通常不应该用于新的开发。

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

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

【讨论】:

  • @Broam:如果 MS 更改格式,这两种方法(替换功能和此答案)都必须更改。
  • 你能不能用基数更新它 var date = new Date(parseInt(jsonDate.substr(6), 10));
  • @JamesKyburz:每条规则都有例外,我认为这是适用例外的时候。 .NET 中的 JSON 日期数字 从不 以“0”开头,因此我们可以放心地省略基数。
  • 值得注意的是,这种日期格式非常糟糕,一般采用 JSON 格式的 ISO-8601 格式日期。见hanselman.com/blog/…
  • 这种方法没有考虑时区,所以当你的服务器和用户在不同的时区时可能会导致严重的问题。我在下面发布了一个答案,解释了在 WCF 和 Javascript 方面处理它的一种非常快速和简单的方法:stackoverflow.com/a/10743718/51061
【解决方案2】:

如果您使用的是 Kotlin,那么这将解决您的问题。

val dataString = "/Date(1586583441106)/"
val date = Date(Long.parseLong(dataString.substring(6, dataString.length - 2)))

【讨论】:

    【解决方案3】:

    TLDR:您无法可靠地转换该仅日期值,而是发送一个字符串...

    ...或者至少这些答案应该是这样开始的。

    这里发生了许多转换问题。

    这是一个没有时间的约会

    每个人似乎都缺少的一点是问题中有多少个尾随零 - 几乎可以肯定它是从没有时间的日期开始的:

    /Date(1224043200000)/
    

    当从 javascript 控制台作为新日期执行此操作时(许多答案的基础)

    new Date(1224043200000)
    

    你得到:

    最初的询问者可能在 EST 中,并且有一个纯日期 (sql) 或带有午夜的 DateTime(不是 DateTimeOffset)。

    换句话说,这里的意图是时间部分是没有意义的。但是,如果浏览器在与生成它的服务器相同的时区执行此操作,则无关紧要,并且大多数答案都有效。

    时区位

    但是,如果您在具有不同时区(例如 PST)的机器上执行上述代码:

    您会注意到,我们现在在另一个时区落后了一天。这不会通过更改序列化程序来解决(它仍将包括 iso 格式的时区)

    问题

    Date (sql) 和 DateTime (.net) 上没有时区,但是一旦您将它们转换为具有时区的东西(在这种情况下是通过 json 推断的 javascript),.net 中的默认操作是假设当前时区。

    序列化创建的数字是自 unix 纪元以来的毫秒数或:

    (DateTimeOffset.Parse("10/15/2008 00:00:00Z") - DateTimeOffset.Parse("1/1/1970 00:00:00Z")).TotalMilliseconds;
    

    javascript 中的 new Date() 将其作为参数。 Epoch 来自 UTC,所以现在无论您是否想要,您都可以在其中获得时区信息。

    可能的解决方案:

    在您的序列化对象上创建一个仅表示日期的字符串属性可能更安全 - 带有“10/15/2008”的字符串不太可能将其他任何人与这种混乱混淆。尽管即使在那里你也必须在解析方面小心: https://stackoverflow.com/a/31732581

    但是,本着为所提问题提供答案的精神,原样:

    function adjustToLocalMidnight(serverMidnight){ 
      var serverOffset=-240; //injected from model? <-- DateTimeOffset.Now.Offset.TotalMinutes
      var localOffset=-(new Date()).getTimezoneOffset(); 
      return new Date(date.getTime() + (serverOffset-localOffset) * 60 * 1000)
    }
    
    var localMidnightDate = adjustToLocalMidnight(new Date(parseInt(jsonDate.substr(6))));
    

    【讨论】:

      【解决方案4】:

      试试这个...

      function formatJSONDate(jsonDate) {
                  var date = jsonDate;
                  var parsedDate = new Date(parseInt(date.toString().substring(6)));
                  var newDate = new Date(parsedDate);
                  var getMonth = newDate.getMonth() + 1;
                  var getDay = newDate.getDay();
                  var getYear = newDate.getFullYear(); 
      
                  var standardDate = (getMonth<10 ? '0' : '') + getMonth + '/' + (getDay<10 ? '0' : '') + getDay + '/' + getYear;
                  return standardDate;
              }
      

      getYear() 返回年份 - 1900,这已经被弃用了一段时间,最好使用 getFullYear()

      【讨论】:

        【解决方案5】:

        我使用这个简单的函数从 Microsoft JSON Date 中获取日期

        function getDateValue(dateVal) {
            return new Date(parseInt(dateVal.replace(/\D+/g, '')));
        };
        

        replace(/\D+/g, '') 将删除除数字以外的所有字符

        parseInt 会将字符串转换为数字

        用法

        $scope.ReturnDate = getDateValue(result.JSONDateVariable)
        

        【讨论】:

          【解决方案6】:

          在下面的代码中。我有

          1.从日期字符串中检索时间戳。

          2.并解析成Int

          3.终于用它创建了Date

          var dateString = "/Date(1224043200000)/";
          var seconds = parseInt(dateString.replace(/\/Date\(([0-9]+)[^+]\//i, "$1"));
          var date = new Date(seconds);
          console.log(date);

          【讨论】:

            【解决方案7】:

            我可以建议的最简单的方法是在JS 上使用正则表达式:

            //Only use [0] if you are sure that the string matches the pattern
            //Otherwise, verify if 'match' returns something
            "/Date(1512488018202)/".match(/\d+/)[0] 
            

            【讨论】:

              【解决方案8】:

              如果你用 JavaScript 说,

              var thedate = new Date(1224043200000);
              alert(thedate);
              

              您会看到它是正确的日期,并且您可以在任何框架的 JavaScript 代码中使用它。

              【讨论】:

              • 这也是我的想法,除了它最终是: var thedate = /Date(1224043200000)/;至少对我来说......
              • Date() 和 Date(1224043200000) 在 Chrome 和 Firefox 中都给出了相同的结果。不确定这是否适用于旧浏览器,但这个答案现在不适用于浏览器。
              • @James,是的,它给出了浏览器的当前日期。 :(
              • 你需要写成“new Date(1224043200000)”。
              【解决方案9】:

              这也可能对您有所帮助。

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

              【讨论】:

                【解决方案10】:

                使用 jQuery UI 日期选择器 - 只有在您已经包含 jQuery UI 时才有意义:

                $.datepicker.formatDate('MM d, yy', new Date(parseInt('/Date(1224043200000)/'.substr(6)))); 
                

                输出:

                2008 年 10 月 15 日

                【讨论】:

                  【解决方案11】:

                  您可以尝试使用的另一个正则表达式示例:

                  var mydate = json.date
                  var date = new Date(parseInt(mydate.replace(/\/Date\((-?\d+)\)\//, '$1');
                  mydate = date.getMonth() + 1 + '/' + date.getDate() + '/' + date.getFullYear();
                  

                  date.getMonth() 返回一个整数 0 - 11,所以我们必须加 1 才能获得正确的月份数

                  【讨论】:

                    【解决方案12】:

                    附带说明,KendoUI 支持转换 Microsoft JSON 日期。 因此,如果您的项目引用了“KendoUI”,您可以简单地使用

                    var newDate = kendo.parseDate(jsonDate);
                    

                    【讨论】:

                      【解决方案13】:

                      这使用regular expression,它也可以工作:

                      var date = new Date(parseInt(/^\/Date\((.*?)\)\/$/.exec(jsonDate)[1], 10));
                      

                      【讨论】:

                        【解决方案14】:

                        如果.NET 返回...

                        return DateTime.Now.ToString("u"); //"2013-09-17 15:18:53Z"
                        

                        然后在 JavaScript 中...

                        var x = new Date("2013-09-17 15:18:53Z");
                        

                        【讨论】:

                          【解决方案15】:

                          您还可以使用 JavaScript 库 moment.js,当您计划处理不同的本地化格式并使用日期值执行其他操作时,它会派上用场:

                          function getMismatch(id) {
                              $.getJSON("Main.aspx?Callback=GetMismatch",
                              { MismatchId: id },
                          
                              function (result) {
                                  $("#AuthMerchId").text(result.AuthorizationMerchantId);
                                  $("#SttlMerchId").text(result.SettlementMerchantId);
                                  $("#CreateDate").text(moment(result.AppendDts).format("L"));
                                  $("#ExpireDate").text(moment(result.ExpiresDts).format("L"));
                                  $("#LastUpdate").text(moment(result.LastUpdateDts).format("L"));
                                  $("#LastUpdatedBy").text(result.LastUpdateNt);
                                  $("#ProcessIn").text(result.ProcessIn);
                              }
                              );
                              return false;
                          }
                          

                          设置本地化就像将配置文件(您可以在momentjs.com 获得)添加到您的项目并配置语言一样简单:

                          moment.lang('de');
                          

                          【讨论】:

                            【解决方案16】:

                            Click here to check the Demo

                            JavaScript/jQuery

                            var = MyDate_String_Value = "/Date(1224043200000)/"
                            var value = new Date
                                        (
                                             parseInt(MyDate_String_Value.replace(/(^.*\()|([+-].*$)/g, ''))
                                        );
                            var dat = value.getMonth() +
                                                     1 +
                                                   "/" +
                                       value.getDate() +
                                                   "/" +
                                   value.getFullYear();
                            

                            结果 - “10/15/2008”

                            【讨论】:

                            • 只是对上述方法的改进。函数 formatearFecha(fec) { var value = new Date ( parseInt(fec.replace(/(^.*()|([+-].*$)/g, '')) ); var mes = value.getMonth (); var dia = value.getDate(); var date = dia + "/" + mes + "/" + value.getFullYear(); if (dia
                            【解决方案17】:

                            以下是解析 JSON 日期的非常简单的解决方案。根据您的要求使用以下功能。您只需将获取的 JSON 格式日期作为参数传递给以下函数:

                            function JSONDate(dateStr) {
                                var m, day;
                                jsonDate = dateStr;
                                var d = new Date(parseInt(jsonDate.substr(6)));
                                m = d.getMonth() + 1;
                                if (m < 10)
                                    m = '0' + m
                                if (d.getDate() < 10)
                                    day = '0' + d.getDate()
                                else
                                    day = d.getDate();
                                return (m + '/' + day + '/' + d.getFullYear())
                            }
                            
                            function JSONDateWithTime(dateStr) {
                                jsonDate = dateStr;
                                var d = new Date(parseInt(jsonDate.substr(6)));
                                var m, day;
                                m = d.getMonth() + 1;
                                if (m < 10)
                                    m = '0' + m
                                if (d.getDate() < 10)
                                    day = '0' + d.getDate()
                                else
                                    day = d.getDate();
                                var formattedDate = m + "/" + day + "/" + d.getFullYear();
                                var hours = (d.getHours() < 10) ? "0" + d.getHours() : d.getHours();
                                var minutes = (d.getMinutes() < 10) ? "0" + d.getMinutes() : d.getMinutes();
                                var formattedTime = hours + ":" + minutes + ":" + d.getSeconds();
                                formattedDate = formattedDate + " " + formattedTime;
                                return formattedDate;
                            }
                            

                            【讨论】:

                              【解决方案18】:

                              在您的页面中添加jQuery UI 插件:

                              function DateFormate(dateConvert) {
                                  return $.datepicker.formatDate("dd/MM/yyyy", eval('new ' + dateConvert.slice(1, -1)));
                              };
                              

                              【讨论】:

                                【解决方案19】:

                                只是在这里添加另一种方法,WCF 采用的“刻度方法”很容易出现时区问题,如果您不是非常小心,例如 here 和其他地方的描述。所以我现在使用 .NET 和 JavaScript 都支持的 ISO 8601 格式,包括时区偏移。详情如下:

                                在 WCF/.NET 中:

                                CreationDate 是 System.DateTime; ToString("o") 使用 .NET 的 Round-trip format specifier 生成符合 ISO 8601 的日期字符串

                                new MyInfo {
                                    CreationDate = r.CreationDate.ToString("o"),
                                };
                                

                                在 JavaScript 中

                                在检索 JSON 之后,我使用 Date 构造函数将日期修复为 JavaSript Date 对象,该构造函数接受 ISO 8601 日期字符串...

                                $.getJSON(
                                    "MyRestService.svc/myinfo",
                                    function (data) {
                                        $.each(data.myinfos, function (r) {
                                            this.CreatedOn = new Date(this.CreationDate);
                                        });
                                        // Now each myinfo object in the myinfos collection has a CreatedOn field that is a real JavaScript date (with timezone intact).
                                       alert(data.myinfos[0].CreationDate.toLocaleString());
                                    }
                                )
                                

                                一旦有了 JavaScript 日期,您就可以使用所有方便可靠的日期方法,例如 toDateStringtoLocaleString 等。

                                【讨论】:

                                  【解决方案20】:

                                  每个答案都有一个共同点:它们都将日期存储为单个值(通常是字符串)。

                                  另一种选择是利用 JSON 的固有结构,并将日期表示为数字列表:

                                  { "name":"Nick",
                                    "birthdate":[1968,6,9] }
                                  

                                  当然,您必须确保对话的双方就格式(年、月、日)以及哪些字段应为日期达成一致,...但它的优点是完全避免了日期到字符串的转换问题。都是数字——根本没有字符串。此外,使用顺序:年、月、日也可以按日期正确排序。

                                  在这里跳出框框思考——JSON 日期不必存储为字符串。

                                  这样做的另一个好处是,您可以利用CouchDB 处理数组值查询的方式轻松(有效地)选择给定年份或月份的所有记录。

                                  【讨论】:

                                  • JSON 中有 一种标准日期格式,即 RFC 3339 格式。
                                  • @gnasher,那很好,但事实并非如此。没有从 RFC 7159 到 3339 的引用,反之亦然。没有de jure 标准JSON 日期格式。剩下的就是de facto 标准,每个标准都有优点/缺点。 That's the nice thing about standards.
                                  【解决方案21】:

                                  在 jQuery 1.5 中,只要你有 json2.js 覆盖旧浏览器,你就可以反序列化来自 Ajax 的所有日期,如下所示:

                                  (function () {
                                      var DATE_START = "/Date(";
                                      var DATE_START_LENGTH = DATE_START.length;
                                  
                                      function isDateString(x) {
                                          return typeof x === "string" && x.startsWith(DATE_START);
                                      }
                                  
                                      function deserializeDateString(dateString) {
                                          var dateOffsetByLocalTime = new Date(parseInt(dateString.substr(DATE_START_LENGTH)));
                                          var utcDate = new Date(dateOffsetByLocalTime.getTime() - dateOffsetByLocalTime.getTimezoneOffset() * 60 * 1000);
                                          return utcDate;
                                      }
                                  
                                      function convertJSONDates(key, value) {
                                        if (isDateString(value)) {
                                          return deserializeDateString(value);
                                        }
                                        return value;
                                      }
                                  
                                      window.jQuery.ajaxSetup({
                                        converters: {
                                          "text json": function(data) {
                                            return window.JSON.parse(data, convertJSONDates);
                                          }
                                        }
                                      });
                                  }());
                                  

                                  我包含了假设您从服务器发送所有日期为 UTC 的逻辑(您应该这样做);然后消费者获得一个 JavaScript Date 对象,该对象具有适当的刻度值来反映这一点。也就是说,在日期调用getUTCHours() 等将返回与在服务器上相同的值,调用getHours() 将返回由浏览器确定的用户本地时区的值。

                                  这没有考虑WCF 格式和时区偏移,尽管添加起来相对容易。

                                  【讨论】:

                                  • 请注意:要使代码正常工作,您必须创建字符串类型的 startsWith 方法
                                  【解决方案22】:

                                  更新

                                  我们有一个内部 UI 库,它必须同时处理 Microsoft 的 ASP.NET 内置 JSON 格式,如最初在这里询问的 /Date(msecs)/,以及大多数 JSON 的日期格式,包括 JSON.NET,如 2014-06-22T00:00:00.0。另外我们需要应对oldIE's inability to cope with anything but 3 decimal places

                                  我们首先检测我们正在使用的日期类型,将其解析为普通的 JavaScript Date 对象,然后将其格式化。

                                  1) 检测 Microsoft 日期格式

                                  // Handling of Microsoft AJAX Dates, formatted like '/Date(01238329348239)/'
                                  function looksLikeMSDate(s) {
                                      return /^\/Date\(/.test(s);
                                  }
                                  

                                  2) 检测 ISO 日期格式

                                  var isoDateRegex = /^(\d\d\d\d)-(\d\d)-(\d\d)T(\d\d):(\d\d):(\d\d)(\.\d\d?\d?)?([\+-]\d\d:\d\d|Z)?$/;
                                  
                                  function looksLikeIsoDate(s) {
                                      return isoDateRegex.test(s);
                                  }
                                  

                                  3) 解析 MS 日期格式:

                                  function parseMSDate(s) {
                                      // Jump forward past the /Date(, parseInt handles the rest
                                      return new Date(parseInt(s.substr(6)));
                                  }
                                  

                                  4) 解析 ISO 日期格式。

                                  我们至少有办法确保我们处理的是标准 ISO 日期或修改为始终具有 3 毫秒位置 (see above) 的 ISO 日期,因此代码因环境而异。

                                  4a) 解析标准 ISO 日期格式,应对 oldIE 的问题:

                                  function parseIsoDate(s) {
                                      var m = isoDateRegex.exec(s);
                                  
                                      // Is this UTC, offset, or undefined? Treat undefined as UTC.
                                      if (m.length == 7 ||                // Just the y-m-dTh:m:s, no ms, no tz offset - assume UTC
                                          (m.length > 7 && (
                                              !m[7] ||                    // Array came back length 9 with undefined for 7 and 8
                                              m[7].charAt(0) != '.' ||    // ms portion, no tz offset, or no ms portion, Z
                                              !m[8] ||                    // ms portion, no tz offset
                                              m[8] == 'Z'))) {            // ms portion and Z
                                          // JavaScript's weirdo date handling expects just the months to be 0-based, as in 0-11, not 1-12 - the rest are as you expect in dates.
                                          var d = new Date(Date.UTC(m[1], m[2]-1, m[3], m[4], m[5], m[6]));
                                      } else {
                                          // local
                                          var d = new Date(m[1], m[2]-1, m[3], m[4], m[5], m[6]);
                                      }
                                  
                                      return d;
                                  }
                                  

                                  4b) 使用固定的三毫秒小数位解析 ISO 格式 - 更容易:

                                  function parseIsoDate(s) {
                                      return new Date(s);
                                  }
                                  

                                  5) 格式化:

                                  function hasTime(d) {
                                      return !!(d.getUTCHours() || d.getUTCMinutes() || d.getUTCSeconds());
                                  }
                                  
                                  function zeroFill(n) {
                                      if ((n + '').length == 1)
                                          return '0' + n;
                                  
                                      return n;
                                  }
                                  
                                  function formatDate(d) {
                                      if (hasTime(d)) {
                                          var s = (d.getMonth() + 1) + '/' + d.getDate() + '/' + d.getFullYear();
                                          s += ' ' + d.getHours() + ':' + zeroFill(d.getMinutes()) + ':' + zeroFill(d.getSeconds());
                                      } else {
                                          var s = (d.getMonth() + 1) + '/' + d.getDate() + '/' + d.getFullYear();
                                      }
                                  
                                      return s;
                                  }
                                  

                                  6) 将它们捆绑在一起:

                                  function parseDate(s) {
                                      var d;
                                      if (looksLikeMSDate(s))
                                          d = parseMSDate(s);
                                      else if (looksLikeIsoDate(s))
                                          d = parseIsoDate(s);
                                      else
                                          return null;
                                  
                                      return formatDate(d);
                                  }
                                  

                                  下面的旧答案对于将此日期格式绑定到 jQuery 自己的 JSON 解析中很有用,这样您就可以得到 Date 对象而不是字符串,或者如果您仍然以某种方式卡在 jQuery

                                  旧答案

                                  如果您在 ASP.NET MVC 中使用 jQuery 1.4 的 Ajax 函数,您可以通过以下方式将所有 DateTime 属性转换为 Date 对象:

                                  // Once
                                  jQuery.parseJSON = function(d) {return eval('(' + d + ')');};
                                  
                                  $.ajax({
                                      ...
                                      dataFilter: function(d) {
                                          return d.replace(/"\\\/(Date\(-?\d+\))\\\/"/g, 'new $1');
                                      },
                                      ...
                                  });
                                  

                                  在 jQuery 1.5 中,您可以通过在 Ajax 调用中使用转换器选项来避免全局覆盖 parseJSON 方法。

                                  http://api.jquery.com/jQuery.ajax/

                                  不幸的是,您必须切换到较旧的 eval 路线才能让 Dates 就地全局解析 - 否则您需要在解析后根据具体情况进行转换。

                                  【讨论】:

                                    【解决方案23】:

                                    不要重复自己 - 使用 $.parseJSON() 自动转换日期

                                    您帖子的答案提供了将日期手动转换为 JavaScript 日期。我稍微扩展了 jQuery 的 $.parseJSON(),因此它能够在您指示它时自动解析日期。它处理 ASP.NET 格式的日期 (/Date(12348721342)/) 以及 ISO 格式的日期 (2010-01-01T12.34.56.789Z),浏览器中的本机 JSON 函数(以及 json2.js 等库)支持。

                                    无论如何。如果您不想一遍又一遍地重复日期转换代码,我建议您阅读 this blog post 并获取可以让您的生活更轻松的代码。

                                    【讨论】:

                                      【解决方案24】:

                                      这令人沮丧。我的解决方案是从 ASP.NET 的 JavaScriptSerializer 生成的值中解析出“/ 和 /”,这样,尽管 JSON 可能没有日期文字,它仍然会被浏览器解释为日期,这就是我真正想要的想要:{"myDate":Date(123456789)}

                                      Custom JavaScriptConverter for DateTime?

                                      我必须强调 Roy Tinker 评论的准确性。这不是合法的 JSON。在它成为 JavaScript 的问题之前解决问题是服务器上的一个肮脏的、肮脏的 hack。它会阻塞 JSON 解析器。我用它来起步,但我不再使用它了。但是,我仍然认为最好的答案在于更改服务器格式化日期的方式,例如其他地方提到的 ISO。

                                      【讨论】:

                                      • 这不是合法的 JSON。它仅在使用 Javascript 解释器进行评估时才有效。但如果你使用的是 JSON 解码器,它就会窒息。
                                      • 同意。如果我只是处理这一条数据,我不会考虑它。但是,如果我正在处理一个包含多个日期和其他属性的对象,那么 eval() 整个事情比一次选择一个属性更容易。最后,根本问题是缺少(合法的)JSON 日期。在此之前,我们将留给我们的创意黑客。
                                      【解决方案25】:

                                      不要想太多。就像我们几十年来所做的那样,从 1970 年 1 月 1 日午夜 GMT/UTC/&c 的事实上的标准纪元传递一个数字偏移量,以自该纪元以来的秒数(或毫秒数)为单位。 JavaScript 喜欢,Java 喜欢,C 喜欢,互联网也喜欢。

                                      【讨论】:

                                      【解决方案26】:

                                      我最终将“字符添加到 Panos 的正则表达式中,以摆脱 Microsoft 序列化程序在将对象写入内联脚本时生成的字符:

                                      因此,如果您在 C# code-behind 中有一个属性,则类似于

                                      protected string JsonObject { get { return jsSerialiser.Serialize(_myObject); }}
                                      

                                      在你的 aspx 中你有

                                      <script type="text/javascript">
                                          var myObject = '<%= JsonObject %>';
                                      </script>
                                      

                                      你会得到类似的东西

                                      var myObject = '{"StartDate":"\/Date(1255131630400)\/"}';
                                      

                                      注意双引号。

                                      为了将其转换为 eval 可以正确反序列化的形式,我使用了:

                                      myObject = myObject.replace(/"\/Date\((\d+)\)\/"/g, 'new Date($1)');
                                      

                                      我使用Prototype 并添加了使用它

                                      String.prototype.evalJSONWithDates = function() {
                                          var jsonWithDates = this.replace(/"\/Date\((\d+)\)\/"/g, 'new Date($1)');
                                          return jsonWithDates.evalJSON(true);
                                      }
                                      

                                      【讨论】:

                                        【解决方案27】:
                                        var newDate = dateFormat(jsonDate, "mm/dd/yyyy"); 
                                        

                                        不使用 jQuery 库还有其他选择吗?

                                        【讨论】:

                                        • 这是一个新问题,应该作为自己的问题提出,而不是嵌入此处。
                                        【解决方案28】:

                                        查看日期ISO标准;有点像这样:

                                        yyyy.MM.ddThh:mm
                                        

                                        变成2008.11.20T22:18

                                        【讨论】:

                                        • 根据 JSON Schema,“日期-时间”格式对应于 RFC 3339,第 5.6 节。因此,您应该为 GMT 中的日期写“yyyy-MM-ddTHH:mm:ssZ”,或者将 Z 替换为像 +hh:mm 这样的时区。
                                        • 问题是 WCF 和其他“旧”的 MS JSON 序列化不使用这种格式,必须考虑到这一点。
                                        【解决方案29】:

                                        您可以使用它从 JSON 中获取日期:

                                        var date = eval(jsonDate.replace(/\/Date\((\d+)\)\//gi, "new Date($1)"));
                                        

                                        然后您可以使用a JavaScript Date Format 脚本(压缩和gzip 压缩后为1.2 KB)随意显示。

                                        【讨论】:

                                        • 行没有错,顺序是 \// 。第一个斜杠被转义,因此它不算作评论。是你的编辑在骗你,这条线可以正常工作。
                                        • @rball,废话:jsonDate = new Date(+jsonDate.replace(/\/Date\((\d+)\)\//, '$1'));
                                        • pst 是正确的,可以在没有 'eval' 的情况下以多种方式执行此操作。 Crockford 说 'eval Is Evil' 因为它的可读性和安全性较低,而且他可能进一步暗示它效率较低且更危险,因为它会命中 javascript 编译器。
                                        • @Edy: new Function 几乎和 eval: dev.opera.com/articles/view/efficient-javascript/… 一样糟糕
                                        • @Edy:这是 eval 的另一种形式,就像“邪恶”一样。改为解析字符串(请参阅下面的答案)
                                        【解决方案30】:

                                        将 JSON 日期转换为 JavaScript 日期很容易:

                                        var s = Response.StartDate;     
                                        s = s.replace('/Date(', '');
                                        
                                        s = s.replace(')/', '');
                                        
                                        var expDate = new Date(parseInt(s));
                                        

                                        【讨论】:

                                          猜你喜欢
                                          • 1970-01-01
                                          • 1970-01-01
                                          • 2020-10-24
                                          • 1970-01-01
                                          • 2015-05-18
                                          • 2021-12-15
                                          相关资源
                                          最近更新 更多