Дата и время десериализованы за день до — UTC Понял

#c# #asp.net #asp.net-mvc #asp.net-mvc-5

#c# #asp.net #asp.net-mvc #asp.net-mvc-5

Вопрос:

Я унаследовал приложение, которое хранит даты по местному времени. Я модернизировал его и неохотно продолжил с бизнес-уровнем, который имеет дело с датами по местному времени.

Мои сообщения на сервер в формате JSON, и я написал Javascript, который отправляет их на сервер с включенной информацией о смещении, например

 {"name":"aal","dob":"1921-10-06T00:00:00 10:30"}
  

Однако, ASP.NET десериализует это как UTC. Итак, если я выберу 6 июля 2016 года в окне выбора даты, сервер десериализует его как 5 июля 2016 года.

Мой вопрос прост. Как я могу договориться о встрече между клиентом и сервером. Если я выберу 6 июля, я хочу сохранить 6 июля (очевидно).

Примечание: это НЕ WebAPI. Старый добрый ванильный MVC 5.

Для одного клиента я добавляю следующий код, чтобы гарантировать, что полезная нагрузка JSON, которая отправляется на сервер, не является UTC:

  // Include offset info in the JSON that gets posted to the server.
Date.prototype.toJSON = function() {
     return moment(this).format();
}
  

Затем я использую следующий код для его публикации (где dob — это дата, о которой идет речь):

     var getPotentialDuplicatePatients = function (name, dob) {

        return $http({
            data: { name: name, dob: dob },
            url: "/PatientData/CheckForPotentialPatientDuplicates",
            method: 'POST'
        });

    };
  

И метод действия в контроллере выглядит следующим образом:

     [HttpPost]
    public ActionResult CheckForPotentialPatientDuplicates(string name, DateTime dob)
    {
        var duplicates = Enumerable.Empty<PatientPlusEpCountDto>();

        if (//Authorize(WebConstants.EditAction, WebConstants.SurgeonAndDataManagerProtectedResource) amp;amp;
            Execute(() => duplicates = _mediator.Send(new GetPotentialPatientDuplicatesQuery
            {
                DateOfBirth = dob,
                PatientName = name
            })))
        {
            return JsonNet(duplicates);
        }

        return JsonError(Errors);            
    }
  

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

Время дня отличается между ними. В исходном исходном DateTime оно включает время суток (даже если объект JSON равен 12:00 утра). В сложном типе это 12:00, как и ожидалось.

Запустив это, я попробую обернуть полезную нагрузку в сложный объект (который я создам) и посмотрю, решит ли это проблему.

Обновление — Временное разрешение

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

 var transformDob = new DateTime(dob.Ticks, DateTimeKind.Utc).ToLocalTime();
var dateOfBirth = transformDob.Date;
  

И я удалил код, который изменяет прототип даты. Теперь запросы json возвращаются к UTC. Необходимо проверить, работает ли он по-прежнему с другими частями приложения.

Комментарии:

1. Было бы здорово (т. е. Необходимо), чтобы вы показали код на обоих концах процесса, чтобы мы могли проверить поведение и протестировать решение.

2. Сначала проверьте, соответствует ли ваше дата-время. При десериализации для вида установлено значение местного времени, в противном случае используйте DateTimeOffset структуру в качестве альтернативы (см. Ссылку на MSDN: msdn.microsoft.com/en-us/library /… ). Чтобы прояснить это, я предпочитаю включить ваш код десериализации в вопрос.

3. @TetsuyaYamamoto я не выполняю десериализацию. .NET Framework является. Рассматриваемое время даты является параметром метода действия в контроллере. Приветствия.

4. @Enigmativity Я отредактирую вопрос с помощью некоторого кода. Писать будет не так много, поскольку десериализация выполняется фреймворком MVC.

5. Возможно, вместо этого использовать DateTimeOffset? msdn.microsoft.com/en-us/library /.