Руководства

Правильные часы работы в зависимости от местоположения посетителя

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

Как получить часовой пояс посетителя

Один запрос по IP сразу возвращает поле timezone, и вы получаете всё нужное без отдельного вызова.

GET /v1/ip?ip=203.0.113.44
{
  "status": "ok",
  "ip": "203.0.113.44",
  "version": 4,
  "found": true,
  "country": "Japan",
  "country_code": "JP",
  "region": "Tokyo",
  "city": "Tokyo",
  "postcode": "100-0001",
  "lat": 35.6762,
  "lon": 139.6503,
  "timezone": "Asia/Tokyo",
  "asn": 2345,
  "org": "Example Telecom"
}

Сравнение с вашими часами работы

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

Второй пример: бизнес с несколькими точками

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

Явно указывайте, какой часовой пояс имеется в виду

Вместо того чтобы молча пересчитывать и надеяться, что посетитель поймёт, показывайте обе части понятно, например: «Сейчас закрыто. Откроется в 9:00 по вашему времени (Asia/Tokyo)». Явное указание помогает избежать путаницы, когда бизнес работает по обе стороны границы, по одну сторону которой переходят на летнее время, а по другую нет.

Распространённая ошибка, которой стоит избегать

Не вычисляйте сравнение «открыто или закрыто» один раз и не кэшируйте этот булев результат на всю сессию посетителя. Сравнение, сделанное в 5:55 вечера, покажет «открыто» и уже в 6:05 останется неверным, если кэшируется само состояние, а не пересчитывается. Кэшируйте идентификатор часового пояса посетителя, поскольку он действительно стабилен в пределах сессии, но само сравнение «открыто или закрыто» заново вычисляйте при каждой отрисовке.

Пограничный случай: пояса без перехода на летнее время

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

Кэшируйте пояс, а не состояние «открыто»

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

Проверка конкретного момента в прошлом или будущем

Если нужно узнать, каким было или будет смещение в конкретный момент, а не прямо сейчас, например чтобы уточнить, во сколько по времени клиента на самом деле был оформлен вчерашний заказ, /v1/timezone принимает необязательный параметр time в виде unix-метки времени как раз для таких проверок прошлого или будущего.

Стоимость запросов

Для этой функции достаточно одного запроса по IP на каждую новую сессию посетителя. Это один запрос, закэшированный на время визита, и даже загруженный интернет-магазин легко укладывается в 2 500 бесплатных запросов в день, включённых в каждый ключ.

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