ASP.NET 从 ajax 调用到 javascript date 解析 DateTime 结果

ASP.NET Parse DateTime result from ajax call to javascript date

本文关键字:date 解析 DateTime 结果 javascript NET ajax 调用 ASP      更新时间:2023-09-26

简介:

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

网络方法

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

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

阿贾克斯调用

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

问题

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

使用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 对象后,您也可以使用其他格式。

参考 : 链接

你可以试试这个:

   _$.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

如果你愿意使用另一个 JavaScript 库:

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

解决此问题的另一种方法是在您的 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 将使用正确的格式。