none
DateTime с тайм зоной в ASP Net WebApi + EF RRS feed

  • Общие обсуждения

  • Здравствуйте!

    Использую ASP Net WebApi + EF и возникла необходимость клиентам возвращать типы данных с тайм зоной.

    Пытался настроить WebApi в WebApiConfig,но это не помогло:

    config.Formatters.JsonFormatter.SerializerSettings.DateTimeZoneHandling 
    = DateTimeZoneHandling.Local;

    Единственное решение, которое я нашел, это создать новый экземпляр даты с использованием DateTimeKind.Local:

        public IEnumerable<ClientDto> Execute()
        {
            var clients = this.DbContext.Clients.Select(
                m => new ClientDto
            {
                Id = m.Id,
                NotificationSendingTime = m.NotificationSendingTime,
                . . .
            }).ToList();
    
            clients.ForEach(m => m.NotificationSendingTime = 
                m.NotificationSendingTime.HasValue 
                ? new DateTime(m.NotificationSendingTime.Value.Ticks, DateTimeKind.Local) 
                : m.NotificationSendingTime);
    
            return clients;
        }

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

    Есть какой-нибудь оптимальный способ включать в DateTime информацию о тайм зоне с использованием  ASP Net WebApi + EF? Спасибо.

    26 апреля 2015 г. 13:34

Все ответы

  • Поясните что именно вы пытайтесь достигнуть. Я спрашиваю потому что практически всегда при передаче и хранении даты/времени используется UTC. Если требуется получить местное время то для пересчета из UTC используется либо текущая зона на клиенте/сервере, либо зона передается отдельно.

    Полезно так же помнить что собственно зона в DateTime не хранится, только лишь факт что это какое то местное время или UTC (что в вашем случае скорее всегo делает всю затею бесполезной). Еесли вам требуется знать зону то следует использовать тип DateTimeOffset.


    This posting is provided "AS IS" with no warranties, and confers no rights.

    26 апреля 2015 г. 16:48
    Модератор
  • Проблема в том, что не имея информации о таймзоне, datepicker и timepicker angularJS, которые используются на клиенте в разных браузерах интерпретируют ее по своему (ИЕ отображает как есть, хром думает что время в UTC и подправляет в соответствии с клиентской тайм зоной). Что касается UTC - проблему не решает по той же самой причине. Только при явном указании таймзоны все правильно отображается. Я крайне удивлен, что, казалось бы, такая простая задачка - пересылать дату в определенном формате оказалась не такой уж и тривиальной. Возможно, действительно лучше хранить дату в UTC, но я уже устал бороться к косяками клиентских библиотек и фреймворков, хочу решить проблему на стороне сервера.
    26 апреля 2015 г. 19:34