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
.
Ответы
Ответ 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
Ответ 3
Если вы открыты для использования другой библиотеки JavaScript:
http://momentjs.com/docs/#/parsing/asp-net-json-date/
Ответ 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 будет использовать правильное форматирование.