web-dev-qa-db-ja.com

ASP.NET Parse DateTimeは、javascriptdateへのajax呼び出しの結果です。

はじめに:

ASP.NETページにWebMethodオブジェクトを返すPersonがあります。フィールドの1つは、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_が表示されます。

13
Mivaweb

これを行う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()の戻り値は配列です。この場合、結果配列の2番目の要素(_results[1]_)は、ソース日付のティック部分を保持します。

たとえば、ソース値が\/Date(836418600000)\/の場合、_results[1]_は_836418600000_になります。
このティック値に基づいて、JavaScript Dateオブジェクトが形成されます。 Dateオブジェクトには、1970年1月1日からのミリ秒数を受け入れるコンストラクターがあります。
したがって、dtは有効なJavaScriptDateオブジェクトを保持します。
次に、convertToJavaScriptDate()関数が日付を_MM/dd/yyyy_としてフォーマットし、呼び出し元に戻ります。

以下に示すように、convertToJavaScriptDate()関数を使用できます。

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

上記の例では_MM/dd/yyyy_形式の日付を使用していますが、Dateオブジェクトが作成されると、他の形式も使用できます。

参照: リンク

22

別のJavaScriptライブラリを使用する場合:

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

1
Even Mien

この問題に取り組む別の方法は、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")
   }}
}
_

すべてのフォーマットが1つの場所にあり、可能な場合は使用できるため、これが最善の方法だと思いました。 [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/YYYY}")]

誕生日要素の上。displayForは正しいフォーマットを使用します。

1
Richard Housham

あなたはこれを試すことができます:

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