8 мин

Часовые пояса в приложениях для планирования: правила, которые предотвратят недовольство пользователей

Часовые пояса в приложениях для планирования часто становятся основной причиной пропущенных встреч. Узнайте о более безопасных моделях данных, правилах для повторяющихся событий, подводных камнях перехода на летнее/зимнее время и дружелюбной копии для пользователей.

Часовые пояса в приложениях для планирования: правила, которые предотвратят недовольство пользователей

Почему часовые пояса делают приложения для планирования ненадёжными

Часовые пояса превращают небольшие арифметические ошибки в сломанные обещания. Встреча, сдвинувшаяся на 1 час — это не "почти то же самое". Меняется, кто приходит, кто выглядит неподготовленным и кто пропускает важное. После двух таких случаев люди перестают доверять календарю и начинают перепроверять всё в чате.

Корень проблемы в том, что время людям кажется абсолютным, а в софте оно таким не является. Люди думают «в локальном времени» ("9:00 по моему времени"). Компьютеры чаще думают в виде смещений ("UTC+2"), которые могут меняться в течение года. Когда приложение смешивает эти представления, оно может показать правильное время сегодня и неверное — в следующем месяце.

Симптомы выглядят случайными, и это делает их хуже. Пользователи жалуются, что встречи «перемещаются», хотя никто их не редактировал, напоминания срабатывают раньше или позже, некоторые экземпляры серии сдвигаются на час, приглашения показывают разные времена на разных устройствах, или после поездки появляются дубликаты событий.

Больше всего страдают те, кто больше всего зависит от расписания: распределённые команды по разным странам, клиенты, бронирующие услуги из-за границы, и вообще те, кто путешествует. Менеджер продукта из Нью-Йорка, летящий в Лондон, может ожидать, что встреча в 14:00 останется привязанной к часовому поясу организатора, тогда как путешественник ожидает, что она пойдёт по его текущему местному времени. Оба ожидания разумны. Правда может быть только одна, поэтому нужны понятные правила.

Дело не только в том, какое время вы показываете на карточке события. Правила часовых поясов затрагивают всю поверхность планирования: одиночные события, повторения, напоминания, письма с приглашениями и всё, что срабатывает в определённый момент. Если вы не определите правило для каждого из этих случаев, модель данных сделает это за вас молча, а пользователи узнают о правиле тяжёлым путём.

Простой пример: еженедельный стендап по понедельникам в 9:00 создаётся в марте. В апреле у одного из участников меняется DST. Если ваше приложение сохранило его как "каждые 7 дней в тот же UTC-инстант", этот участник вдруг увидит его в 10:00. Если приложение сохранило его как "каждый понедельник в 9:00 в часовом поясе организатора", оно останется в 9:00, а UTC-инстант изменится. Любой из подходов может быть правильным, но приложение должно быть последовательным и честным в этом вопросе.

Ключевые понятия: UTC, локальное время, смещения и DST

Большинство багов с часовыми поясами происходят из путаницы нескольких базовых идей. Правильная терминология также делает копию интерфейса понятнее.

UTC и «абсолютное время»

UTC (Coordinated Universal Time) — это глобальные эталонные часы. Представьте их как единую временную шкалу, которой все пользуются.

"Абсолютное время" — это конкретный момент на этой шкале, например 2026-01-16 15:00:00 UTC. Если двое людей в разных странах смотрят на этот момент, они видят один и тот же момент, просто отображённый в локальных часах.

Локальное время, смещения и идентификаторы часовых поясов

Локальное время — то, что человек видит на настенных часах, например "9:00". Само по себе этого недостаточно, чтобы однозначно определить момент. Нужны правила, где это произошло.

Смещение — разница от UTC в данный момент, например UTC+2 или UTC-5. Смещения меняются в течение года во многих местах, поэтому хранить только "UTC+2" рисковано.

Идентификатор часового пояса — это настоящее правило, обычно имя IANA, например "America/New_York" или "Europe/Berlin". Идентификаторы содержат историю и будущие изменения этой зоны, включая DST.

Практическая разница:

  • Смещение: "UTC-5" (не обещает, что останется таким)
  • Идентификатор: "America/New_York" (знает, когда станет UTC-4)

DST (переход на летнее/зимнее время)

DST — это когда регион переводит часы вперёд или назад обычно на час. Это означает изменение UTC-смещения.

Два сюрприза с DST:

  • "Переход вперёд" создаёт пропавший час. Некоторые локальные времена просто не существуют.
  • "Переход назад" повторяет час. Одинаковое локальное время встречается дважды.

Абсолютное время против локального (стенного) времени

Локальное (стенное) время — это то, что пользователи вводят: "Каждый понедельник в 9:00". Абсолютное время — то, что система должна исполнить: "отправить напоминание в этот точный момент UTC". Повторяющиеся события часто начинаются как правила в локальном времени, а затем конвертируются в серию абсолютных моментов.

Пользователи думают, что они забронировали "9:00 в моём часовом поясе". Ваша база данных может сохранить "2026-03-10 13:00 UTC". Оба утверждения могут быть верны, но только если вы также запомнили, какие правила часового пояса имелись в виду.

Устройства тоже меняют часовые пояса. Люди путешествуют, и ноутбуки могут автоматически переключать зону. Если ваше приложение тихо переинтерпретирует сохранённое "9:00" в новой зоне устройства, пользователи почувствуют, что время встречи "сдвинулось", хотя они ничего не делали.

Варианты модели данных, которые предотвращают молчаливые сдвиги

Большинство багов "моя встреча сдвинулась" — это баги модели данных. Самый безопасный дефолт для одиночных событий: хранить один инстант в UTC и конвертировать его в локальное время пользователя только при отображении.

Одиночное событие — это то, что случается один раз, например "12 окт. 2026 в 15:00 в Берлине". Этот момент происходит однократно. Если вы храните его как UTC (инстант на шкале времени), он всегда будет соответствовать тому же моменту, независимо от того, кто его просматривает.

Хранение только локального времени (например, "15:00") ломается, как только кто-то смотрит это из другого часового пояса или создатель поменял настройки устройства. Хранение только смещения (например, "+02:00") ломается позже, потому что смещения меняются с DST. "+02:00" — это не место, это временное правило.

Когда хранить идентификатор часового пояса вместе с UTC? Каждый раз, когда вам важно, что имел в виду создатель, а не только сохранённый инстант. Идентификатор зоны, например "Europe/Berlin", помогает при отображении, аудите и поддержке и становится необходимым для повторяющихся событий. Он позволяет сказать: "Это событие создано на 15:00 по берлинскому времени", даже если смещение Берлина изменится в следующем месяце.

Практическая запись для одиночного события обычно включает:

  • start_at_utcend_at_utc)
  • created_at_utc
  • creator_time_zone_id (имя IANA)
  • original_input (текст или поля, которые ввёл пользователь)
  • input_offset_minutes (опционально, для отладки)

Для поддержки эти поля превращают расплывчатую жалобу в воспроизводимый сценарий: что пользователь ввёл, какую зону заявляло устройство и какой инстант система сохранила.

Будьте строги в том, где выполняется конвертация. Считайте сервер источником правды для хранения (только UTC), а клиент — источником намерения (локальное время плюс идентификатор зоны). Конвертируйте локальное время в UTC один раз, при создании или редактировании, и не "переконвертируйте" сохранённый UTC при последующих чтениях. Молчаливые сдвиги часто случаются, когда и клиент, и сервер применяют конверсии, или когда одна сторона угадывает часовой пояс вместо использования предоставленного.

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

Пошагово: от ввода пользователя до хранения и отображения

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

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

Безопасный поток, которому можно следовать

Повторяемая последовательность действий предотвращает большинство сюрпризов:

  • Ввод пользователя: зафиксируйте локальное время, которое он ввёл (например, 2026-03-10 09:00) и часовой пояс события как IANA-имя (America/New_York), а не аббревиатуру вроде "EST".
  • Нормализация: проверьте, что такое локальное время существует в этой зоне (DST может создавать несуществующие времена), затем конвертируйте в инстант.
  • Хранение: сохраните инстант в UTC вместе с IANA-зоной (и, при необходимости, оригинальным локальным временем, которое выбрал пользователь).
  • Отображение: при показе конвертируйте сохранённый UTC-инстант в текущую зону зрителя и подписывайте явно ("9:00 AM New York time").
  • Уведомления: планируйте напоминания от UTC-инстанта, но форматируйте сообщение в локальном времени получателя.

Пример: хост в Нью-Йорке создаёт "Вт 9:00 AM (America/New_York)". Участник в Берлине увидит это как "3:00 PM (Europe/Berlin)", потому что один и тот же UTC-инстант отображается в его зоне.

События на весь день и поля типа "дата без времени"

Событие на весь день — это не "00:00 UTC до 00:00 UTC". Чаще это диапазон дат в конкретной зоне. Храните all-day как значения только даты (start_date, end_date) плюс зону, использованную для интерпретации этой даты. Иначе событие на весь день может показаться начавшимся на день раньше для пользователей в зонах с отрицательным смещением от UTC.

Перед выпуском протестируйте реальный сценарий: создайте событие, смените зону устройства, затем откройте его снова. Событие должно по-прежнему представлять тот же момент (для таймированных событий) или ту же локальную дату (для all-day), а не молчаливо сдвигаться.

Повторяющиеся события: выберите правило до того, как выберете схему хранения

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

Большинство багов с планированием проявляются, когда событие повторяется. Частая ошибка — считать рекурренцию просто копированием даты вперёд. Сначала решите, к чему привязано событие:

  • Привязано к инстанту: событие повторяется в тот же момент времени (тот же UTC-инстант), поэтому локальное время может меняться при переходе DST.
  • Привязано к локальному времени: событие повторяется в одно и то же локальное время в конкретной зоне, даже если UTC-инстант изменяется.

Для большинства календарей (встречи, напоминания, часы приёма) пользователи ожидают именно локального времени. "Каждый понедельник в 9:00" обычно означает 9:00 в выбранном городе, а не "тот же UTC-инстант навсегда".

Что хранить (чтобы потом можно было всё объяснить)

Храните рекурренцию как правило плюс контекст, необходимый для её интерпретации, а не как заранее сгенерированный список временных меток:

  • Начальная локальная дата и время (то, что ввёл пользователь)
  • Идентификатор часового пояса (IANA)
  • Правило рекурренции (частота, интервал, дни)
  • Исключения (пропуски, правки отдельных экземпляров)
  • Опциональное условие окончания (количество или until-дата в локальных терминах)

Это поможет обрабатывать DST без молчаливых сдвигов и сделает правки предсказуемыми.

Генерация появлений без дрейфа

Когда вам нужно получить события за диапазон дат, генерируйте их в локальном времени в зоне события, затем конвертируйте каждый экземпляр в UTC для хранения или сравнения. Важно прибавлять "одну неделю" или переходить к "следующему понедельнику" в локальных терминах, а не делать "+ 7 * 24 часа" в UTC.

Простой тест для ума: если пользователь выбрал 9:00 еженедельно в Берлине, каждый сгенерированный экземпляр должен быть 9:00 по берлинскому времени. UTC-значение будет меняться, когда Берлин переходит на DST, и это правильно.

Когда пользователи путешествуют, будьте явными в поведении. Событие, привязанное к Берлину, всё ещё должно происходить в 9:00 по берлинскому времени, а путешественник в Нью-Йорке увидит его в своём сконвертированном локальном времени. Если вы поддерживаете "плавающие" события, которые следуют за текущим часовым поясом зрителя, явно это помечайте. Это полезно, но удивляет людей, когда не указано.

Подводные камни DST, порождающие самые злые тикеты

Проблемы с DST кажутся пользователям случайными, потому что приложение показывает одно время при бронировании, а потом другое. Исправление — не только техническое. Нужны ясные правила и понятные формулировки.

Когда часы переводят вперёд, некоторые локальные времена просто не существуют. Классический пример — 02:30 в ночь начала DST. Если вы позволяете пользователю выбрать такое время, нужно решать, что оно означает.

Когда часы переводят назад, наоборот: одно и то же локальное время происходит дважды. "01:30" может значить первый раз (до перехода) или второй (после перехода). Если вы не спросите, вы будете угадывать, и люди заметят, когда придут на час раньше или позже.

Практические правила, предотвращающие сюрпризы:

  • Если выбранного локального времени не существует (переход вперёд), либо блокируйте выбор с объяснением, либо автоматически перенесите на следующее валидное время и сразу покажите изменение.
  • Если локальное время повторяется (переход назад), спросите: "Какое 01:30 вы имеете в виду?" и пометьте варианты как "раннее" и "позднее" с указанием смещения.
  • Если существующая встреча становится невалидной из-за изменения правил (обновление часовых поясов), по возможности сохраните первоначальное намерение и уведомите пользователя, если приходится сдвигать.
  • Для напоминаний планируйте их исходя из фактического инстанта события, а не "N минут до стенного времени".
  • Никогда не формулируйте это как ошибку пользователя. Подайте это как изменение часов в той локации.

Реалистичный старт тикета поддержки: кто-то бронирует "02:30" в Нью-Йорке на следующий месяц, а в день события приложение тихо показывает "03:30". Лучше написать простую подсказку при создании: "Этого времени нет 10 марта из‑за перевода часов. Выберите 01:30 или 03:00." Если вы авто‑скорректируете, скажите: "Мы перенесли встречу на 03:00, потому что 02:30 в этот день пропускается."

Если вы считаете DST краевым случаем интерфейса, он вылезет как проблема доверия. Если вы воспринимаете это как правило продукта, оно становится предсказуемым.

Частые ошибки и ловушки, которых стоит избегать

Постройте и заработайте кредиты
Получайте кредиты за то, что делитесь своими решениями на Koder.ai или приглашаете друзей попробовать сервис.

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

Ловушки хранения данных

Типичная ошибка — сохранять только смещение (например -05:00) вместо полноценного IANA-идентификатора (например America/New_York). Смещения меняются при начале или окончании DST, поэтому событие, которое выглядело корректно в марте, может быть некорректным в ноябре.

Аббревиатуры часовых поясов — ещё один источник багов. "EST" может означать разные вещи для разных людей и систем, и некоторые платформы сопоставляют аббревиатуры по‑разному. Храните полный идентификатор зоны и используйте аббревиатуры только для отображения, если вообще показываете их.

All-day события — отдельная категория. Если хранить такое событие как "полночь UTC", пользователи в зонах с отрицательным смещением часто увидят его начавшимся на день раньше. Храните all-day как даты плюс зону, используемую для интерпретации этих дат.

Короткий чеклист для код‑ревью:

  • Не храните только смещения и не надеетесь, что DST "потом подхватится".
  • Не принимайте "EST/PST/CET" как надёжную зону.
  • Не храните all-day события как инстанты (00:00 UTC).
  • Не планируйте напоминания в часовом поясе сервера вместо часового пояса события.
  • Не допускайте, чтобы веб и мобильные клиенты по‑разному выполняли конверсии.

Ошибки доставки, напоминаний и кросс‑платформенные несоответствия

Напоминания и приглашения могут идти не так, даже когда хранение событий сделано правильно. Пример: пользователь создаёт "9:00 по берлинскому времени" и ждёт напоминание в 8:45 по Берлину. Если ваш планировщик задач работает в UTC и вы случайно восприняли "8:45" как локальное время сервера, напоминание сработает раньше или позже.

Кросс‑платформенные различия усугубляют это. Один клиент может интерпретировать неоднозначное время по зоне устройства, другой — по зоне события, третий — по закэшированному правилу DST. Для согласованного поведения держите конверсии и развертку рекурренций в одном месте (обычно на сервере), чтобы все клиенты видели одинаковый результат.

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

Быстрая проверка перед выпуском функций планирования

Большинство багов с часовыми поясами не проявляются при разработке. Они возникают, когда кто‑то путешествует, когда перевели часы, или когда два человека сравнивают скриншоты.

Проверки данных и хранения

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

  • Для одиночных событий храните точный инстант (UTC) и, если нужно, контекст, чтобы показывать "что выбрал пользователь" позже.
  • Для всего, что повторяется или ориентировано на пользователя, храните IANA-идентификатор зоны (например "America/New_York"), а не только смещение.
  • Ясно разделяйте "плавающие" времена (например "каждый день в 9:00" в конкретной зоне) и инстанты (например 2026-01-16T14:00Z).

Проверки DST и крайних случаев

DST создаёт два опасных сценария: несуществующие времена (переход вперёд) и времена, которые повторяются (переход назад). Ваше приложение должно решить, что делать, и делать это последовательно.

  • Когда пользователь выбирает несуществующее локальное время, блокируйте это с понятным сообщением или автоматически смещайте на следующее валидное время (и сообщайте об этом).
  • Когда пользователь выбирает неоднозначное время (повторяющийся час), заставляйте выбрать вариант или применяйте правило (раннее/позднее) и документируйте это.
  • Проверьте повторяющиеся события через границу DST. Решите, остаётся ли "9:00 локально" 9:00, или фиксируется UTC. Выберите один и придерживайтесь его.

Сценарий для теста: еженедельный синк "Понедельник 09:00" в Берлине. Проверьте время для человека в Нью‑Йорке до и после перехода Европы на DST, а затем снова после перехода США (они меняют даты по разному).

Проверки интерфейса и ожиданий

Многие злые тикеты возникают из интерфейса, который скрывает часовой пояс. Люди предполагают, что приложение читает их мысли.

  • Показывайте часовой пояс везде, где отображается время: детали события, экраны подтверждения, письма, напоминания и экспорты.
  • Если вы планируете от имени другого, показывайте обе зоны: "09:00 Europe/Berlin (03:00 America/New_York)".
  • Сделайте элементы управления выбором зоны очевидными и отражайте выбранную зону в тексте ("Это событие запланировано в Europe/Berlin").

Тестирование

Не полагайтесь на часовой пояс вашего ноутбука и один формат локали.

  • Добавьте тесты для поездок: создайте событие в одной зоне, затем просмотрите его в другой.
  • Добавьте тесты, которые пересекают начало и конец DST, включая пропущенные и повторяющиеся часы.
  • Тестируйте разные форматы локалей (12-часовой vs 24-часовой, день‑месяц vs месяц‑день), чтобы избежать сообщений о "неверном дне".

Реалистичный пример: одна встреча, две страны, один переход DST

Владейте своей реализацией
Сохраняйте полный контроль: экспортируйте исходники, когда логика планирования готова.

Основатель из Лондона назначает еженедельный стендап с коллегой в Нью‑Йорке. Они выбирают "вторник в 10:00" и ожидают, что он всегда будет утром для Лондона и ранним днём для Нью‑Йорка.

Более безопасный подход — считать встречу "10:00 в Europe/London каждый вторник", вычислять каждое появление в лондонском времени, сохранять фактический инстант (UTC) для этого появления и показывать его в локальном времени каждого зрителя.

Вокруг весеннего перехода США и Великобритании, даты перехода различаются:

  • До перехода США: 10:00 London (GMT) показывает как 05:00 в New York (EST).
  • После перехода США, но до перехода UK: 10:00 London (всё ещё GMT) будет 06:00 в New York (EDT).
  • После перехода UK: 10:00 London (BST) снова покажется как 05:00 в New York (EDT).

Ничего не "переместилось" для организатора. Встреча оставалась в 10:00 по лондонскому времени. Единственное, что менялось — смещение Нью‑Йорка на пару недель.

Напоминания должны следовать тому, что видит каждый человек, а не тому, что он "видел раньше". Если у коллеги в Нью‑Йорке есть напоминание за 15 минут, оно должно срабатывать в 05:45 до смены США, затем в 06:45 в промежутке, без правок события.

Добавьте правку: после двух тяжёлых ранних подъемов организатор в Лондоне меняет стендап на 10:30 с следующей недели. Хорошая система сохраняет намерение, применяя изменение в часовом поясе организатора, генерируя новые UTC‑инстанты для будущих появлений и оставляя прошлые — как были.

Хорошая копия снижает тикеты поддержки: "Повторяется каждый вторник в 10:00 (время Лондона). Приглашённые видят время в своём локальном часовом поясе. Время может сдвигаться на 1 час при начале или окончании перехода на летнее время."

Следующие шаги: понятная копия и безопасный план разработки

Большинство "багов с часовыми поясами", о которых жалуются пользователи, на самом деле — ошибки в ожиданиях. Модель данных может быть правильной, но если копия интерфейса неоднозначна, люди предполагают своё. Рассматривайте часовые пояса как обещание UX, а не просто бэкенд‑деталь.

Начните с копии, которая называет часовой пояс везде, где показывается время вне основного UI, особенно в уведомлениях и письмах. Не ограничивайтесь "10:00 AM". Ставьте зону рядом и держите формат постоянным.

Примеры копий, которые уменьшают путаницу:

  • "Вт, 12 мар, 10:00 AM (America/New_York)"
  • "Для вас это 3:00 PM (Europe/London)"
  • "Это событие сохранено в: New York time"
  • "Если вы путешествуете, эта встреча остаётся по нов‑йоркскому времени"
  • "Время может сдвигаться на 1 час при начале или окончании перехода на летнее время"

Дни с DST также нуждаются в дружелюбных сообщениях об ошибках. Если пользователь выбирает несуществующее время (например 2:30 ночи в ночь перехода вперёд), избегайте технических формулировок и предложите опции: "2:30 недоступно 10 марта из‑за перевода часов. Выберите 1:30 или 3:30." Если время встречается дважды в ночь перехода назад, спросите прямо: "Вы имеете в виду первое 1:30 или второе?"

Чтобы строить безопасно, прототипируйте полный поток (создание, приглашение, просмотр в другой зоне, правка после DST) до полировки экранов:

  • Опишите правила в одном абзаце (что остаётся фиксированным, что конвертируется).
  • Набросайте модель данных (хранить UTC плюс исходный IANA‑часовой пояс).
  • Параллельно подготовьте тексты для писем и уведомлений вместе с UI.
  • Протестируйте три сценария: поездка, переход вперёд, переход назад.
  • Зафиксируйте решения, затем реализуйте.

Если вы быстро собираете функцию планирования, платформа типа Koder.ai может помочь итеративно проработать правила, схему и UI вместе. Скорость полезна, но та же дисциплина остаётся: храните инстанты в UTC, сохраняйте IANA‑зону события для намерения и всегда показывайте пользователям, какой часовой пояс они видят.

FAQ

Стоит ли хранить события календаря в UTC или по местному времени?

Храните разовые события как точные моменты времени в UTC, а при показе переводите их в местное время каждого пользователя. Также сохраняйте IANA-идентификатор часового пояса события, чтобы учесть намерение создателя.

Почему смещения UTC недостаточно?

Используйте IANA-идентификатор часового пояса, например America/New_York или Europe/Berlin. Смещение вроде UTC-5 может меняться с началом или окончанием перехода на летнее время, а идентификатор пояса учитывает эти правила.

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

Для большинства встреч сохраняйте одно и то же местное время по часам в выбранном организатором поясе. Создавайте каждое повторение в этом поясе, а затем переводите его в UTC. Так еженедельная встреча в 9:00 останется в 9:00 после перехода на летнее или зимнее время.

Что должно делать приложение со временем, которого не существует во время перехода на летнее время?

Не давайте выбрать такое время и понятно объясните причину либо перенесите его на ближайшее допустимое время и покажите изменение перед сохранением. Например, сообщите пользователю, что 2:30 пропускается из-за перевода часов вперёд.

Что происходит, когда одно и то же местное время встречается дважды?

Спросите пользователя, имеет ли он в виду более ранний или более поздний вариант, и покажите смещение для каждого выбора. При переводе часов назад одно и то же местное время может наступить дважды, поэтому ошибка в выборе может сдвинуть встречу на час.

Должна ли встреча следовать за человеком в поездках?

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

Как хранить события на весь день?

Храните события на весь день как даты начала и окончания вместе с поясом, который задаёт смысл этих дат. Не превращайте их в метки времени UTC на полночь: люди в других поясах могут увидеть событие в неправильный день.

Где следует показывать часовой пояс события?

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

Клиент или сервер должны переводить местное время в UTC?

Пусть клиент отправляет время по часам и IANA-идентификатор часового пояса, а сервер проверяет их и переводит в UTC. Сервер должен формировать окончательное сохраняемое значение, чтобы веб-версия, мобильное приложение, письма и задачи напоминаний работали по одному правилу.

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

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

Похожие статьи