Как обрабатывать JSON DateTime, возвращенный из служб данных WCF (OData)
Я считаю, что я упускаю что-то очевидное. Когда я запрашиваю ответ JSON от службы OData, я получаю другой результат для свойств DateTime, чем при запросе XML. В качестве примера я использую канал NerdDinner OData.
в формате JSON:
http://www.nerddinner.com/Services/OData.svc/Dinners(1)?$format=json
"EventDate": "/Date(1235764800000)/"
XML-код:
http://www.nerddinner.com/Services/OData.svc/Dinners(1)
<d:EventDate m:type="Edm.DateTime">2009-02-27T20:00:00</d:EventDate>
когда я делаю предупреждение(новая дата (1235764800000)), я получаю этот результат:
Я также получаю результат 8PM, когда я запускаю то же самое запрос с LINQPad. почему часовой пояс неверен в результате JSON? похоже, предполагается, что ответ находится в GMT. Должен ли я обрабатывать это на клиенте (через javascript) или это то, что я могу установить на сервере?
Я использую jQuery на клиенте и Службы данных WCF (и Entity Framework) на сервере.
обновление:
Я использую Datejs на стороне клиента для обработки форматирования данных UTC. Мне интересно, является ли это правильным способом решения этой проблемы.
function getDateString(jsonDate) {
if (jsonDate == undefined) {
return "";
}
var utcTime = parseInt(jsonDate.substr(6));
var date = new Date(utcTime);
var minutesOffset = date.getTimezoneOffset();
return date.addMinutes(minutesOffset).toString("M/d/yyyy h:mm tt");
}
8 ответов
по данным эта ссылка msdn, DateTime
объекты...
...представлено в JSON как " / дата(номер клещей)/". Количество тактов является положительное или отрицательное длинное значение, которое указывает количество тиков (миллисекунды), которые прошли с тех пор полночь 01 января 1970 года UTC.
таким образом, вы правы, что .NET предполагает, но это UTC вместо GMT (хотя они похожи). Есть некоторые хороший ответы здесь, чтобы дать более подробную информацию, а также предоставить методы для разбора JSON на полезную дату на клиенте.
что касается преобразования дат из UTC в определенный часовой пояс, на сервере вы можете использовать TimeZoneInfo
класс, который имеет ConvertTimeFromUtc
метод. Или вы можете написать пользовательский конвертер, который наследуется от JavaScriptConverter
класса. В javascript есть UTC
и getTimezoneOffset
методы, которые могут быть использованы.
надеюсь, что это помогает и удачи.
Если это может помочь, я столкнулся с той же проблемой, и я закончил реализовать что-то вроде этого, не так элегантно, но это работает.
String.prototype.DateWCF = function(dateformat) {
return new Date(parseInt(this.match(/\/Date\(([0-9]+)(?:.*)\)\//)[1])).format(dateformat);
};
затем на $.ajax
успех:
success: function(data) {
$.each(data, function() {
var hello = this.DateTimeProperty.DateWCF('dd-MM-yyyy'));
});
}
Я надеюсь, что это может быть полезным.
Это должно работать просто отлично:
var date = new Date(parseInt(jsonDate.substr(6)));
функция substr извлекает часть" /Date ( ", а функция parseInt получает целое число и игнорирует") / " в конце.
для форматированных дат JSON ISO-8601 просто передайте строку в конструктор дат:
var date = new Date(jsonDate); //no ugly parsing needed; full timezone support
это уже было исправлено и обсуждалось, что посмотрите на это предыдущий пост
используя дата.сценарий js.Попробуйте ниже
new Date(parseInt(yourDateValue)).toString("ddd, dd-MMM-yyyy, hh:mm:ss")
Если вы анализируете ответы WCF JSON date в Javascript, момент.JS date framework удаляет большую часть головной боли:момент.JS-разбор ASP.NET JSON Dates. Он также имеет некоторые другие полезные методы.
мы производим данные.js как клиент JavaScript для служб OData. Если вы работаете с веб-клиентом, использование этой библиотеки удалит эту головную боль, а также не позволит вам столкнуться с другими.
данные.js обрабатывает все JSONP и другие проблемы от вашего имени, делая запрос и анализ данных JSON таким простым:
OData.read(
"http://services.odata.org/Northwind/Northwind.svc/Categories",
function (data) {
var html = "";
$.each(data.results, function(l) { html += "<div>" + l.CategoryName + "</div>"; });
$(html).appendTo($("#target-element-id"));
}
);
попробуйте это:
function getDate(datestr) {
return new Date(eval('new ' + datestr.replace(/\//g, '')));
}
этот ответ может быть отклонен (!!) но альтернативным решением является просто изменить службу WCF, чтобы вернуть даты более дружественным способом.
вот пример JSON из моей службы WCF, показывающий UpdateDateOriginal
значение (используя раздражающее форматирование по умолчанию, которое WCF использовал для моего значения DateTime) и более дружелюбное UpdateDate
версия того же значения DateTime.
Я написал код, чтобы сделать это в следующем статья: