2014-12-05 41 views
10

简介:ASP.NET解析结果的日期时间从Ajax调用javascript日期

我有我的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

+0

在您的webmethod中尝试此代码Birthday = new DateTime(1988,9,13).ToLongDateString(); – 2014-12-05 11:23:13

+0

生日是DateTime类型,所以我不能解析它到一个字符串 – Mivaweb 2014-12-05 11:24:48

+0

请按照此[博客](http://www.hanselman.com/blog/OnTheNightmareThatIsJSONDatesPlusJSONNETAndASPNETWebAPI.aspx) – chridam 2014-12-05 11:25:14

回答

18

使用ToJavaScriptDate()功能,这是否对你:

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(); 
} 

ToJavaScriptDate()函数接受/ Date(ticks)/ format中的值并返回一个日期字符串,格式为MM/dd/yyyy格式。在内部,ToJavaScriptDate()函数使用表示模式/日期(([^)] +))/的正则表达式。 exec()方法接受源日期值并测试值中的匹配。 exec()的返回值是一个数组。在这种情况下,结果数组的第二个元素(结果1)包含源日期的ticks部分。例如,如果源值为/ Date(836418600000)/那么结果1将为836418600000.基于此刻度值构成JavaScript Date对象。 Date对象具有一个构造函数,它接受自1970年1月1日以来的毫秒数。因此,dt保存有效的JavaScript Date对象。 ToJavaScriptDate()函数将日期格式设置为MM/dd/yyyy并返回给调用者。可以使用ToJavaScriptDate()函数,如下所示:

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

虽然上述示例使用日期在MM/dd/yyyy格式,就可以自由地使用一次Date对象构造的任何其它格式。

参考:Link

1

你可以试试这个:

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

+1

您的解决方案也适用于我! +1 – Mivaweb 2014-12-05 11:35:14

1

解决这个问题的另一种方法是,使一个新的元素在你的个人类,然后使用那。示例

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

在生日元素上方,以便displayFor将使用正确的格式。