Я пишу это, чтобы собрать комментарии по нашим подходам и, надеюсь, помочь кому-то еще (и моей памяти).
Сценарий
- Все наши базы данных используют типы данных
DateTime
без информации о часовом поясе. - Внутри мы знаем, что все даты/время в наших базах данных находятся в локальной (Новой Зеландии) времени, а не в UTC. Для веб-приложения это не идеально, но мы не контролируем дизайн всех этих баз данных, поскольку они поддерживают другие системы (учет, начисление заработной платы и т.д.).
- Мы используем Entity Framework (сначала модель) для доступа к данным.
Наша проблема
- Без конкретной информации о часовом поясе стек Breeze/Web Api/Entity Framework кажется предпосылкой того, что время UTC, а не локальное, что, вероятно, является лучшим, но не подходит для наших приложений.
- Breeze любит передавать даты на сервер в стандартном формате UTC, особенно в строках запроса (например,
where
). Представьте контроллер Breeze, который непосредственно предоставляет таблицу из базы данных как IQueryable. Клиент Breeze будет передавать любые условия фильтра даты (где) на сервер в формате UTC. Entity Framework будет точно использовать эти даты для создания SQL-запроса, совершенно не подозревая, что даты таблицы базы данных находятся в нашем локальном часовом поясе. Для нас это означает, что результаты будут от 12 до 13 часов смещены от тех, которые мы хотим (в зависимости от летнего времени).
Наша цель - обеспечить, чтобы наш код на стороне сервера (и база данных) последовательно использовал даты в нашем локальном часовом поясе и что все запросы возвращают желаемые результаты.