【问题标题】:ASP.NET Parse DateTime result from ajax call to javascript date从 ajax 调用到 javascript 日期的 ASP.NET 解析 DateTime 结果
【发布时间】:2015-02-03 13:13:09
【问题描述】:

简介:

我的 ASP.NET 页面上有一个 WebMethod,它返回一个 Person 对象。 其中一个字段是Birthday,它是DateTime 属性。

WebMethod

[WebMethod]
public static Person GetPerson()
{
     Person p = new Person() {
         Id = 1,
         Name = "Test",
         Birthday = new DateTime(1988, 9, 13)
     };

     return p;
}

如果我使用$.ajax() 进行调用,我会得到带有Person 对象的服务器响应。

Ajax 调用

// Class instance
var Ajaxcalls = function () {

}

_$.extend(Ajaxcalls, {
    GetPerson: function (label) {
        var self = label instanceof _$ ? label : $(label);

        _$.ajax({
            url: 'Default.aspx/GetPerson',
            type: "POST",
            dataType: "json",
            contentType: "application/json; charset=utf-8",
            success: function (data) {
                console.log(JSON.stringify(data.d));
                self.html(new Date(Date.parse(data.d.Birthday)));
            }
        });
    }
});

结果:

{"__type":"AjaxTest.Classes.Person","Id":1,"Name":"Test","Birthday":"/Date(590104800000)/"}

问题

如何将 Birthday [/Date(590104800000)/] 解析为 javascript/jQuery 日期? 我试过new Date(Date.parse(data.d.Birthday)),但它给了我一个Invalid date。

【问题讨论】:

  • 在你的 webmethod 中试试这个代码 Birthday = new DateTime(1988, 9, 13).ToLongDateString();
  • 生日是 DateTime 类型,所以我无法将其解析为字符串
  • 关注blog
  • @ArunPrasanth 就像一个魅力,如果你想为它发布答案!

标签: javascript c# jquery asp.net ajax


【解决方案1】:

使用为您执行此操作的convertToJavaScriptDate() 函数:

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

convertToJavaScriptDate() 函数接受\/Date(ticks)\/ 格式的值并返回MM/dd/yyyy 格式的日期字符串。
在内部,convertToJavaScriptDate() 函数使用表示模式/Date\(([^)]+)\)/ 的正则表达式。
exec() 方法接受源日期值并测试该值是否匹配。 exec() 的返回值是一个数组。在这种情况下,结果数组的第二个元素 (results[1]) 包含源日期的刻度部分。

例如,如果源值为\/Date(836418600000)\/,则results[1] 将为836418600000。
基于这个刻度值形成一个 JavaScript Date 对象。 Date 对象有一个构造函数,它接受自 1970 年 1 月 1 日以来的毫秒数。
因此dt 拥有一个有效的 JavaScript Date 对象。
然后convertToJavaScriptDate() 函数将日期格式化为MM/dd/yyyy 并返回给调用者。

可以使用convertToJavaScriptDate()函数如下图:

options.success = function (order) {
 alert("Required Date : " + convertToJavaScriptDate(order.RequiredDate) + ", Shipped Date : " + convertToJavaScriptDate(order.ShippedDate));
};

虽然上面的例子使用MM/dd/yyyy格式的日期,但是一旦构造了Date对象,你也可以使用其他格式。

参考:Link

【讨论】:

  • 这是包含时间的版本:function ToJavaScriptDateTime(value) { var pattern = /Date\(([^)]+)\)/; var results = pattern.exec(value); var dt = new Date(parseFloat(results[1])); return dt.getHours() + ":" + dt.getMinutes() + " " + ('0' + dt.getDate()).slice(-2) + "." + ('0' + (dt.getMonth() + 1)).slice(-2) + "." + dt.getFullYear(); }
  • 我刚刚尝试了你的方法,我得到了一个错误 jQuery.Deferred 异常:无法读取 null 的属性 '1' 类型错误:无法读取 null 的属性 '1'
  • 你能给我一个jsfiddle吗??
【解决方案2】:

解决这个问题的另一种方法是在你的 person 类中创建一个新元素,然后使用它。示例

public class Person {
   public int Id {get;set;}
   public string Name {get;set;}
   public DateTime Birthday {get;set;}
   public string BirthdayFormat { get {
      return Birthday.toString("dd/MM/YYYY")
   }}
}

我认为这将是最好的方式,因为所有的格式都在一个地方,并且您可以在可能的情况下使用。 [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/YYYY}")]

Birthday 元素上方,因此 displayFor 将使用正确的格式。

【讨论】:

    【解决方案3】:

    如果您愿意使用其他 JavaScript 库:

    http://momentjs.com/docs/#/parsing/asp-net-json-date/

    【讨论】:

    • 这很好,如果您打算在 javascript 中使用日期/时间,即。一些操作
    【解决方案4】:

    你可以试试这个:

       _$.ajax({
            url: 'Default.aspx/GetPerson',
            type: "POST",
            dataType: "json",
            contentType: "application/json; charset=utf-8",
            success: function (data) {
                console.log(JSON.stringify(data.d));
                var src = data.d.Birthday;
                //Remove all non-numeric (except the plus)
                src = src.replace(/[^0-9 +]/g, ''); 
                //Create date
                var birthDate = new Date(parseInt(src));
                self.html(birthDate);
            }
        });
    

    JSFiddle

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-29
      • 2016-11-28
      • 1970-01-01
      • 1970-01-01
      • 2011-01-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多