DateTime Json Возврат из WebAPI со стандартным сериализатором

Я знаю, что этот вопрос неоднократно хэшировался, и я читал много сообщений об этом хэшировании, но все же путаюсь.

Используя MVC4/WebAPI, у меня есть datetime, которое просто создается как новая DateTime.Now.

My WebAPI - это возвращаемые данные следующим образом:

 HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK, new
            {
                data = sessionRecordSmalls,
                count = sessionRecordSmalls.Count,
                success = true
            });

где sessionRecordsSmall имеет общедоступное свойство DateTime в нем.

Когда я смотрю на дату в отладчике VS, он показывает это как сейчас без часового пояса, потому что DateTime не включает часовой пояс.

{10/6/2012 9:45:00 AM}

Когда я смотрю, что загружается с сервера, я вижу в JSON

2012-10-06T09: 45: 00

Я думаю, что T0 означает Timezone 0, а не 100% уверен в этом. Моя библиотека JavaScript интерпретирует ее как часовой пояс 0, а затем показывает фактическую дату, загруженную как GMT (-9 часов назад для меня).

Мой вопрос в том, что скачал JSON? Это включает часовой пояс? Я пропустил какой-то важный шаг здесь?

Ответ 1

Время даты 2012-10-06T09:45:00, которое мы получаем в JSON с веб-API и сериализатором по умолчанию, формат ISO 8601.

На самом деле это так называемый Комбинированные представления даты и времени. Выдержка:

. Единую точку во времени можно представить, объединив полное выражение даты, буква T в качестве разделителя и действительный время. Например, "2007-04-05T14: 30"...

В этом формате информация о часовом поясе отсутствует. Как указано в Обозначения часовых поясов Выдержка:

Временные зоны в ISO 8601 представлены как местное время (с не указано), в формате UTC или в виде смещения от UTC. Если нет UTC информация о соотношении дается с указанием времени, время предполагается, что оно находится в локальном времени.

Другими словами, если нет смещения от указанного UTC, это рассматривается как локальное время.

Формат UTC будет расширен с помощью Z в конце

Если время в UTC, добавьте Z непосредственно после времени без пространство. Z - обозначение зоны для нулевого смещения UTC. "09:30 UTC" поэтому представляется как "09: 30Z" или "0930Z". "14:45:15 UTC" будет "14: 45: 15Z" или "144515Z".

Время UTC также известно как "Зулу", так как "Зулу" - это слова фонетического алфавита НАТО для "Z".

Итак, дата-время, которое мы получаем, это формат ISO 8601, который рассматривается как локальный часовой пояс (нет Z в конце, как этот 2012-10-06T09:45:00Z)

Ответ 2

если сериализация с помощью json.net следует учитывать, что вы можете указать DateTimeZoneHandling.

Пример в WebApiConf.cs

var json = config.Formatters.JsonFormatter;
json.SerializerSettings.DateTimeZoneHandling =Newtonsoft.Json.DateTimeZoneHandling.Local;