Почему приложение, созданное с помощью ИИ, показывает неправильное время (и как исправить часовые пояса)
Приложение показывает неправильное время, когда оно сохраняет показания часов вместо момента времени, отображает часовой пояс сервера вместо часового пояса пользователя или игнорирует переход на летнее время — это и есть та незаметная причина, из-за которой возникают двойные записи на приём и напоминания в 2 часа ночи.
Почему приложение, созданное с помощью ИИ, показывает неправильное время?
Потому что два человека, находящиеся в разных местах, могут одновременно смотреть на правильное время — и видеть два разных числа. Именно в этом несоответствии и заключается вся проблема часовых поясов. Клиент в Мадриде бронирует слот на 15:00; вы находитесь в Мехико, и на вашем экране та же бронь показывает 8:00 утра. Вы смотрите на это и уверены, что что-то сломалось.
Ничего не сломалось. В Мадриде сейчас 15:00, а в Мехико — 8:00 утра, и это один и тот же момент времени. Вы оба правы. Именно этот разрыв — когда два правых человека видят два разных числа — стоит за удивительным количеством сообщений об ошибках вида «моё приложение странно себя ведёт».
Эта проблема подкрадывается незаметно, потому что во время создания и тестирования приложения вы — единственный человек, в одном месте, на одном устройстве. Всё сходится. Часовые пояса показывают зубы только тогда, когда на то же время смотрит второй человек, находящийся в другом месте. Если у вашего приложения есть пользователи более чем в одном городе — или оно отправляет любые сообщения по расписанию, — эта проблема обязательно вас настигнет. Лучше встретить её осознанно.
Что такое часовой пояс, если точно?
Часовой пояс — это «пространственная» половина времени: та часть, которая превращает единый универсальный момент в показания местных часов. Вот идея, которая всё объясняет: у каждого момента времени есть две составляющие.
- Момент — единый миг, одинаковый повсюду на Земле.
- Место — где вы находитесь, когда смотрите на часы.
«15:00» само по себе ничего не значит. 15:00 где? Компьютеры решают эту задачу, сохраняя момент времени в нейтральном, «безместном» формате (в разговоре с вашим билдером вы услышите слово «UTC» — думайте о нём как о часах в неизменной точке отсчёта), а затем показывая его в местном времени каждого человека, когда тот смотрит на экран.
Когда приложение показывает неправильное время, это почти всегда происходит потому, что оно упустило одну из этих двух составляющих — забыло про место или изначально не сохранило настоящий момент времени.
Что вызывает ошибки часовых поясов в приложениях?
Почти все ошибки часовых поясов вызваны тремя конкретными промахами: приложение сохраняет показания часов вместо реального момента времени, показывает часовой пояс сервера вместо пользовательского и игнорирует переход на летнее время.
1. Приложение сохраняет показания часов, а не момент времени. Кто-то выбирает «9:00 утра», и приложение сохраняет текст «9:00 утра» без привязки к месту. Теперь оно показывает «9:00 утра» всем и везде, что иногда именно то, что нужно (напоминание о приёме лекарства должно срабатывать в 9 утра по местному времени каждого человека), а иногда — катастрофа (прямой вебинар должен начинаться в один-единственный момент времени для всех). Если приложение неправильно угадывает, что вы имели в виду, время «плывёт».
2. Приложение показывает время сервера, а не пользователя. Ваше приложение работает на компьютере в дата-центре — скажем, в Вирджинии. Если ему не сказали иначе, оно с радостью будет показывать всем время Вирджинии. Ваши пользователи в Лондоне теперь отстают на несколько часов и понятия не имеют почему.
3. Переход на летнее время сдвигает часы, а приложение этого не замечает. Дважды в год во многих местах переводят часы на час. Повторяющаяся встреча «каждый вторник в 9:00 утра», которую вы настроили зимой, внезапно оказывается в 8:00 или в 10:00 летом, если приложение зафиксировало не место, а постоянное смещение по времени.
Три реальные версии этой истории
Мероприятие, которое началось три раза. Основатель создал простую страницу для онлайн-воркшопа с одним указанным временем начала: «Начало в 18:00». Участники из трёх стран прочитали «18:00» как свои собственные местные 18:00. Треть из них присоединилась на час позже, несколько человек — на час раньше, и все винили ссылку. Решением стала не более удачная ссылка, а показ каждому человеку его собственного местного времени начала, с явным указанием пояса.
Рассылка, которая пришла в 2 часа ночи. Письмо с настройкой «отправлять каждое утро в 8:00» уходило в 8:00 по времени сервера. Для европейской половины списка это была глубокая ночь. Показатели открытий у этих подписчиков были удручающими, и поначалу это выглядело как проблема с контентом. На деле это была проблема часовых поясов.
Двойная бронь в воскресенье. Приложение для записи позволило двум людям забронировать один и тот же слот на массаж в ночь, когда переводили часы «назад», потому что 1:30 ночи в ту ночь наступило дважды, а приложение восприняло оба раза как один и тот же момент. Такое случается редко, но именно такие ошибки стоят вам реального клиента и реальных извинений.
Что попросить своего билдера исправить в отношении часовых поясов?
Попросите о четырёх конкретных вещах простыми словами — вам не нужно разбираться во всём этом детально. Скопируйте эти формулировки:
«Сохраняй каждое время как момент в UTC и дополнительно сохраняй часовой пояс каждого пользователя».
«Когда показываешь время, показывай его в часовом поясе того, кто смотрит, и указывай пояс прямо рядом с временем — например,
15:00 (ваше время)или15:00 CET».
«Для всего, что повторяется, — напоминаний, расписаний, регулярных событий — привязывай это к месту (например, к «America/Mexico_City»), а не к фиксированному числу часов, чтобы переход на летнее время обрабатывался автоматически».
«Дай мне протестировать это так, будто я нахожусь в другой стране».
Последний пункт важнее, чем может показаться, и как раз с него начинается то, что вы можете сделать сами.
Как протестировать приложение на ошибки часовых поясов?
Большинство ошибок часовых поясов можно поймать за две минуты, даже не имея пользователя в другой стране, — просто притворитесь, что находитесь там сами:
- Откройте настройки даты и времени на телефоне или компьютере и переключите часовой пояс на что-то далёкое — Токио, Лондон, куда угодно.
- Перезагрузите приложение.
- Посмотрите на каждое место, где отображается время. Оно всё ещё имеет смысл? Понятно ли, чьё это время?
Если бронь, которая должна быть на 15:00, теперь показывает 4:00 утра без каких-либо пояснений, — вы нашли ошибку раньше, чем это сделал клиент. По завершении верните настройки обратно. Для случаев с повторяющимися напоминаниями и переходом на летнее время самый надёжный способ проверки — попросить одного знакомого в другой стране посмотреть на конкретную дату и сказать, какое время он видит.
Нужно ли вам вообще беспокоиться о часовых поясах?
Честно говоря — иногда нет, и об этом стоит сказать прямо. Если абсолютно все пользователи вашего приложения находятся в одном городе — например, инструмент для составления графика персонала местного ресторана или запись в районный клуб, — вы можете в основном пропустить сложные моменты. Просто будьте последовательны и подписывайте время, чтобы не было сомнений.
Часовые пояса становятся реальной проблемой в тот момент, когда верно одно из двух: два человека из разных мест делятся общим временем или ваше приложение отправляет что-либо по расписанию. В тот самый момент, когда вы пересекаете эту черту, самая дешёвая страховка оказывается и самой простой: всегда показывайте часовой пояс рядом со временем. Одна эта привычка убирает неоднозначность, которая порождает большинство подобных историй, — ещё до того, как будут внедрены более глубокие исправления.
Так что в следующий раз, когда вы добавите в приложение поле с датой или временем, задайте себе один вопрос, прежде чем двигаться дальше: чьё это время? Если вы можете ответить на этот вопрос вслух, вы уже опережаете большинство создаваемых приложений.