Как обрабатывать 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)), я получаю этот результат: alt text

Я также получаю результат 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.

enter image description here

Я написал код, чтобы сделать это в следующем статья:

изменить сериализацию даты по умолчанию в WCF