Дата часовых поясов и летнее время - PullRequest
0 голосов
/ 02 апреля 2019

Я работаю в веб-приложении планировщика, и часовые пояса моего клиента (Angular) и сервера (ядро Asp.net) различаются.Клиент находится в любом часовом поясе.Давайте использовать (GMT-3).Сервер имеет UTC.

Предположим, что такой случай:

Один пользователь планирует событие по местному времени в 08:00.Когда эта информация отправляется на обслуживание, она сохраняет в базе данных 11:00.

Таким образом, когда пользователь получает эту информацию, клиент преобразуется обратно в 08:00 из-за часового пояса -3 часа.

Но, если это расписание составлено на дату в будущем, когда в стране клиента будет переход на летнее время, оно будет преобразовано обратно в -2 часа.Таким образом, он будет преобразован в 09:00 AM для клиента, и это неправильно.

Как справиться с переходом на летнее время, когда я получаю даты с сервера?

Ответы [ 2 ]

3 голосов
/ 02 апреля 2019

Проще говоря, дата и время должны быть сохранены в UTC. Вы всегда можете добраться от UTC до времени пользователя. Проблема с хранением даты и времени со смещением заключается в том, что это смещение не является контекстным. Например, предположим, что пользователь находится в DST с часовым поясом, который обычно составляет -3 смещения от UTC. Таким образом, их текущее смещение равно -2. Вы храните смещение -2, и что теперь? Это -2, потому что они находятся в зоне -2, или -2, потому что это зона -3 в летнее время. Там нет никакого способа узнать. По сути, вам не удалось собрать важную информацию.

У вас нет этой проблемы с датами, хранящимися в UTC. Вы можете просто узнать текущее время пользователя, включая его текущее смещение (летнее или нет), и сравнить его со временем в вашем хранилище данных. Возможно, вам сначала потребуется преобразовать время пользователя в UTC, но во многих случаях это не так. Например, тип DateTimeOffset достаточно умен, чтобы иметь возможность сравнивать с учетом смещения. Многие базы данных также поддерживают это для типов столбцов с возможностью смещения.

2 голосов
/ 02 апреля 2019

Если я правильно понимаю проблему, вы хотите, чтобы на сервере использовались дата и время, сохраненные в формате UTC, и чтобы клиент отображал местное время при обработке летнего времени.Я рекомендую использовать пакеты angular2-moment, Moment & Momemt-Timezone npm.Этот пакет сможет автоматически обрабатывать летнее время, когда вы предоставите iana_timezone, например America\Chicago.

moment.tz(<utc-date-time>, <iana-timezone>).format()

. Он будет обрабатывать все необходимые преобразования, необходимые для клиента.

См. Пример Stackblitz

Также проверьте Документы о часовых поясах момента

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...