java календарь, дата и управление временем для приложения с несколькими часовыми поясами

Я разрабатываю веб-приложение для планирования. Я ожидаю, что пользователи будут добавлять события в нескольких разных часовых поясах и регионах. Задача состоит в том, чтобы правильно представить эти события.

Итак, в качестве примера:
если пользователь находится в часовом поясе EST и просматривает событие вебинара, которое было добавлено другим пользователем в PST, я хочу преобразовать фактическое время PST события в местное время для зрителя. Таким образом, если событие запланировано на 14:00 по тихоокеанскому времени, то оно должно быть показано как 17:00 по восточному поясному времени.

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

Все мысли и комментарии приветствуются.
ТИА

1 ответ

Решение

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

  • Происходит ли событие в определенный универсальный момент времени? Если это так, вы должны записать время события в единицах UTC.

    Например, задача, которая выполняется каждые 24 часа, будет запланирована по времени UTC, а не по местному времени. Он может начаться в какую-то местную полночь, но когда вступят в силу изменения летнего времени, он может быть запущен в 23:00 или 01:00 по местным часам.

  • Однако, если событие запланировано людьми, оно, скорее всего, относится к местному времени, поэтому вы должны записать его таким образом.

    Например, встреча, которая происходит в 08:00 по восточному времени, всегда будет происходить в это местное время. Зимой это будет 13:00 UTC, а летом - 12:00 UTC.

    Таким образом, в этом контексте вы не можете записать запланированное время начала в терминах UTC. Это очень распространенная ошибка, так как в Интернете есть множество советов, которые говорят "всегда храните с использованием UTC", что было бы неправильно в этом сценарии.

    Вместо этого вы должны хранить два значения - местное время, такое как 08:00 и его идентификатор часового пояса IANA, такой как America/New_York, Вам также может понадобиться сохранить шаблон повторения или конкретную дату в зависимости от того, как запланировано событие.

  • Рассмотрите возможность использования Joda Time вместо Java Calendar или же Date classess. Это избавит вас от многих головных болей. Обязательно прочитайте документацию Joda Time и поймите, как она работает.

    Joda Time имеет все функции, которые вам понадобятся для конвертации между одним часовым поясом и другим - что, я считаю, было главной задачей вашего вопроса.

  • Убедитесь, что имеется процедура регулярного обновления данных о часовых поясах. Обновления выпускаются несколько раз в год, так как правительства стран мира вносят изменения в юридические определения своих часовых поясов. Вы не можете просто развернуть его один раз и забыть об этом.

  • Также убедитесь, что вы понимаете, что преобразование из местного времени в определенный момент UTC не является идеальной функцией из-за перехода на летнее время. Если событие запланировано на недопустимое или неоднозначное местное время, у вас должна быть стратегия обнаружения и обработки этого в вашем приложении. Вы можете просто применить некоторые предположения, или вы можете изо всех сил спросить пользователя, что делать.

    Например, если я планирую событие на 2:00 по восточному времени каждый день, то 10 марта 2013 года это время не существует. Должно ли событие произойти в 3:00 утра? Или это не должно происходить вообще?

    Другой пример: если я планирую событие на 1:00 по восточному времени каждый день, то 3 ноября 2013 года это время происходит дважды. Должно ли событие произойти в первый (дневной свет) момент? Или во втором (стандартном времени) экземпляре? Или оба? Должен ли я принять один или другой, или я должен спросить пользователя, что они имеют в виду?

    Только вы можете решить, что делать, так как это ваше заявление. Но игнорирование проблемы может привести к ошибкам.

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

Другие вопросы по тегам