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

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

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

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

Все мысли и комментарии оценены.
ТИА

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

  • Происходит ли событие в определенный универсальный момент времени? Если это так, вы должны записать время события в формате 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 не является идеальной функцией из-за перехода на летнее время . Если событие запланировано в течение недействительного или неоднозначного локального времени, у вас должна быть страtagsя для обнаружения и борьбы с этим в вашем приложении. Вы можете просто применить некоторые предположения или, возможно, захотите попросить у пользователя, что делать.

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

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

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

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

  • Веб-сервис - текущий часовой пояс для города?
  • Как установить часовой пояс по умолчанию в node.js?
  • Как получить часовой пояс из местоположения с использованием координат широты и долготы?
  • ORA-01882: область часового пояса не найдена
  • Временные зоны MySQL
  • Преобразование между локальными временами и GMT / UTC в C / C ++
  • Как перевести между часовыми поясами Windows и IANA?
  • Список идентификаторов Timezone для использования с FindTimeZoneById () в C #?
  • Получение системных часовых поясов на разных языках
  • Могу ли я получить часовой пояс браузера в ASP.NET или мне нужно полагаться на операции JS для извлечения информации?
  • Мне нужен список сопоставлений городов для timezones - лучший способ получить его?
  • Давайте будем гением компьютера.