Проблема с передачей даты по сети - PullRequest
0 голосов
/ 28 мая 2019

У меня есть приложение MVC, которое отправляет значение даты с сервера в США в формате JSON, и оно отображается на компьютере в Чили.

На стороне сервера есть это действие в контроллере:

   public async Task<ActionResult> GetFacturas(Models.DataTableAjaxPostModel model)
    {
        // Some other code in between
        // ----
        return Json(fecha);   // fecha has the value of 2019-04-16 00:00:00
    }

Используя инструмент разработки Chrome, я вижу, что дата получена в объекте JSON как 1555383600000.

Используя сайт https://www.epochconverter.com/ я перевел эту дату в удобочитаемый для человека формат и увидел, что это:

GMT: Tuesday, 16 April 2019 3:00:00
Your time zone: Monday, 15 April 2019 23:00:00 GMT-04:00

Даже когда контроллер MVC получил дату как 2019-04-16 00:00:00, кажется, что когда Json его сериализовал, он был преобразован в GMT с использованием -3 часового пояса, поэтому, наконец, дата GMT была получена клиентским компьютером , который, в свою очередь, преобразовал дату обратно в местное время, применяя операцию -4.

Операционная система настроена как часовой пояс -4, а приложение MVC настроено следующим образом в файле web.config:

<globalization culture="es-CL" uiCulture="es-CL" />

Как мне избежать этой проблемы?

EDIT:

Переменная «fecha» - это объект DateTime, возвращаемый из базы данных, таким образом:

var fecha = db.Entity.Select(f => f.DatetimeField).FirstOrDefault();

Конечно, я упростил запрос, но дело в том, что "fecha" перед возвратом функции является объектом DateTime, значение которого равно 2019-04-16 00: 00: 00.

Привет

Jaime

1 Ответ

0 голосов
/ 28 мая 2019

Я предполагаю, что значение в вашем JSON выглядит примерно так: "/Date(1555383600000)/", который является более старым форматом даты JSON .В этом формате локальный часовой пояс сервера применяется, когда свойство .Kind значения DateTime имеет значение DateTimeKind.Local или DateTimeKind.Unspecified.

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

fetcha = DateTime.SpecifyKind(fetch, DateTimeKind.Utc);

Теперь вы увидите, что значение сериализуется как "/Date(1555372800000)/".

Текущие версии ASP.Net и Newtonsoft.Json используют ISO8601 формат вместо.Без каких-либо изменений в вашем коде ваши значения сериализуются на основе свойства .Kind следующим образом:

  • С DateTimeKind.Unspecified, as "2019-04-16T00: 00: 00.0000000" `
  • С DateTimeKind.Utc, как "2019-04-16T00:00:00.0000000Z"
  • С DateTimeKind.Local, как "2019-04-16T00:00:00.0000000-03:00" (с использованием смещения tz сервера)

Вы можете переключаться между двумя форматами, используязначение DateFormatHandling , но я рекомендую оставить его по умолчанию IsoDateFormat.См. Также Сериализация дат в JSON .

Десериализация на стороне клиента также является важным фактором.Если вам вручают метку времени (со старым форматом), тогда эта метка времени выравнивается по UTC.Если вам передается строка (с новым форматом), на метку времени влияет смещение в строке или часовой пояс локального браузера, если смещение не предусмотрено.Кроме того, объект Date в JavaScript имеет много функций, которые могут только использовать локальный часовой пояс браузера.

Учитывая все это, очень сложно получить значение только для датысериализовать сквозной без какого-либо влияния часового пояса.Вы можете попробовать описанные выше подходы, но если на самом деле вы просто хотите сохранить, восстановить, отобразить и передать одно и то же значение только для даты, то вы также можете просто рассмотреть возможность отправки строки без времени, как в "2019-04-16":

return Json(fetch.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...