Как обрабатывать json DateTime, возвращенный службами данных WCF (OData) - PullRequest
20 голосов
/ 29 сентября 2010

Полагаю, мне здесь не хватает чего-то очевидного. Когда я запрашиваю ответ JSON от службы OData, я получаю другой результат для свойств DateTime, чем когда я запрашиваю XML. В качестве примера я буду использовать ленту OData NerdDinner.

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

Я также получаю результат 8 вечера, когда я выполняю тот же запрос с 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 ]

19 голосов
/ 29 сентября 2010

Согласно этой ссылке MSDN , DateTime объекты ...

... представлены в формате JSON как "/ Date (количество тактов) /".Число тиков - это положительное или отрицательное длинное значение, которое указывает количество тиков (миллисекунд), прошедшее с полуночи 01 января 1970 года по Гринвичу.

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

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

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

7 голосов
/ 13 июля 2011

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

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

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

4 голосов
/ 13 февраля 2014

Это должно работать просто отлично:

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

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

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

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

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

3 голосов
/ 08 июня 2012

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

new Date(parseInt(yourDateValue)).toString("ddd, dd-MMM-yyyy, hh:mm:ss")
1 голос
/ 22 января 2013

Если вы анализируете ответы дат JSON WCF в Javascript, инфраструктура дат Moment.js устраняет большую часть головной боли: Moment.js - Анализ дат JSON ASP.NET . У него также есть несколько других удобных методов.

0 голосов
/ 09 января 2015

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

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

enter image description here

IВыложил код для этого в следующей статье:

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

0 голосов
/ 25 декабря 2013

Попробуйте это:

    function getDate(datestr) {
        return  new Date(eval('new ' + datestr.replace(/\//g, '')));
    }
0 голосов
/ 29 июня 2012

Мы производим 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")); 
  } 
);
...