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

Как обрабатывать json DateTime, возвращаемые из служб данных WCF (OData)

Я считаю, что здесь нет ничего очевидного. Когда я запрашиваю ответ JSON от службы OData, у меня получается другой результат для свойств DateTime, чем при выполнении запроса XML. В качестве примера я использую фид NDrdDinner 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) на сервере.

Update:

Я использую 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");
 }
4b9b3361

Ответ 1

В соответствии с эта ссылка msdn, DateTime объекты...

... представлен в JSON как "/Дата (число тиков)/". Количество тиков - это положительное или отрицательное значение указывает количество тиков (миллисекунд), прошедших с тех пор полночь 01 января, 1970 UTC.

Итак, вы правы, что .NET предполагает, но это UTC вместо GMT (хотя они похожи). Есть некоторые хорошие ответы здесь, на SO которые дают более подробную информацию, а также предоставляют методы для разбора JSON в удобную дату на клиенте.

Что касается преобразования дат от UTC к определенному часовому поясу, на сервере вы можете использовать класс TimeZoneInfo, который имеет ConvertTimeFromUtc. Или вы можете написать собственный конвертер, который наследуется от класса JavaScriptConverter. В javascript есть UTC и getTimezoneOffset, которые могут быть использованы.

Надеюсь, это поможет и удачи.

Ответ 2

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

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'));
            });
        }

Я надеюсь, что это может быть полезно.

Ответ 3

Использование date.js script.Попробуйте ниже

new Date(parseInt(yourDateValue)).toString("ddd, dd-MMM-yyyy, hh:mm:ss")

Ответ 4

Это должно работать нормально:

var date = new Date(parseInt(jsonDate.substr(6)));

Функция substr выдает "/Date (" part ", а функция parseInt получает целое число и игнорирует" )/"в конце.

Для ISO-8601 отформатированных дат JSON просто передайте строку в конструктор Date:

var date = new Date(jsonDate); //no ugly parsing needed; full timezone support

Это уже было исправлено и обсуждено, что посмотрите на этот предыдущий пост

Ответ 6

Мы производим data.js в качестве клиента JavaScript для служб OData. Если вы работаете с веб-клиентом, использование этой библиотеки устранит эту головную боль, а также не позволит вам работать в других.

Data.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")); 
  } 
);

Ответ 7

Попробуйте следующее:

    function getDate(datestr) {
        return  new Date(eval('new ' + datestr.replace(/\//g, '')));
    }

Ответ 8

Этот ответ может быть отклонен (!!), но альтернативным решением является просто изменить вашу службу WCF, чтобы вернуть даты более дружественным образом.

Вот пример JSON из моей службы WCF, показывающий значение UpdateDateOriginal (используя раздражающее форматирование по умолчанию, которое WCF использовал для моего значения DateTime), и более дружественную версию UpdateDate того же значения DateTime.

enter image description here

Я разместил код, чтобы сделать это в следующей статье:

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