Следите за использованием ключа, пока не упёрлись в лимит
Наблюдение за заголовками квоты по ходу работы показывает приближение к лимиту задолго до того, как запрос будет отклонён.
«Мы работаем до 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.