Подтвердить что ты не робот

ASP.NET Parse DateTime результат от ajax-вызова до даты javascript

Введение:

У меня есть WebMethod на моей странице ASP.NET, которая возвращает объект 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.

4b9b3361

Ответ 1

Используйте функцию 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() использует регулярное выражение, которое представляет шаблон /Date (([^)] +))/. Метод exec() принимает значение исходной даты и тесты для соответствия в значении. Возвращаемое значение exec() - это массив. В этом случае второй элемент массива результатов (результаты 1) содержит галочки в исходной дате. Например, если исходное значение равно /Date (836418600000), то результаты 1 будут иметь значение 836418600000. На основе этого значения тиков формируется объект JavaScript Date. Объект Date имеет конструктор, который принимает число миллисекунд с 1 января 1970 года. Таким образом, 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.

ссылка: Ссылка

Ответ 2

Вы можете попробовать следующее:

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

Ответ 4

Еще один способ решения этой проблемы - создать новый элемент в вашем классе, а затем использовать его. Пример

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 будет использовать правильное форматирование.