2014-12-05 42 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將使用正確的格式。