Monitore o uso da sua chave antes de atingir um limite
Acompanhar seus cabeçalhos de cota ao longo do caminho mostra quando um limite está se aproximando, bem antes de uma requisição ser realmente rejeitada.
"Estamos abertos até as 18h" só é útil se o visitante que lê souber de quais 18h você está falando. Um visitante em um fuso horário diferente do da sua empresa precisa que essa comparação seja feita no horário local dele, não no seu.
Uma única consulta de IP retorna diretamente um campo timezone, oferecendo o que você precisa sem uma chamada separada.
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"
}Converta o horário de funcionamento da sua empresa, armazenado no fuso horário da própria empresa, para o fuso do visitante usando o identificador de fuso horário que você acabou de obter e depois compare com o horário local atual do visitante para decidir se mostra "aberto agora" ou "fechado", junto com o horário local de referência que você está exibindo.
Uma empresa com unidades em cidades diferentes deve consultar o horário publicado de cada unidade no fuso horário armazenado dela e depois comparar cada um separadamente com o fuso do visitante, em vez de presumir que um único horário vale para todas. Isso importa principalmente quando um visitante compara duas unidades na mesma página, já que uma pode aparecer como aberta e a outra como fechada exatamente no mesmo momento se estiverem em fusos diferentes ou adotarem o horário de verão de forma diferente.
Em vez de converter silenciosamente e torcer para que o visitante entenda, mostre as duas informações com clareza, algo como "Fechado no momento. Abre às 9h no seu horário (Asia/Tokyo)." Ser explícito evita confusão quando uma empresa opera dos dois lados de uma fronteira em que um lado muda com o horário de verão e o outro não.
Não calcule a comparação de aberto ou fechado uma única vez para guardar esse resultado booleano em cache pelo resto da sessão do visitante. Uma comparação feita às 5:55 da tarde vai indicar "aberto" e continuar errada às 6:05 se o estado de aberto for guardado em cache em vez de recalculado. Guarde em cache o identificador de fuso horário do visitante, já que ele é realmente estável durante uma sessão, mas recalcule a comparação de aberto ou fechado a cada renderização.
Algumas regiões mantêm um deslocamento fixo o ano inteiro, enquanto uma região vizinha muda duas vezes por ano, o que significa que a diferença entre os dois fusos não é constante ao longo do calendário. Se a sua lógica de comparação fixar no código um deslocamento em horas, em vez de trabalhar a partir do identificador de fuso horário e deixar a sua biblioteca de datas cuidar da conversão, ela vai sair de sincronia justamente nas semanas próximas a uma mudança de horário de verão.
O identificador de fuso horário do visitante é estável durante uma sessão e vale a pena guardá-lo em cache. Se a empresa está aberta no momento muda ao longo do dia, então recalcule essa comparação na hora da renderização usando o fuso em cache, em vez de guardar em cache o estado de aberto ou fechado.
Se você precisar saber qual era, ou qual será, o deslocamento em um momento específico, e não agora, como confirmar em que horário um pedido feito ontem realmente foi feito no fuso do cliente, /v1/timezone aceita um parâmetro opcional time como timestamp unix exatamente para esse tipo de verificação no passado ou no futuro.
Uma consulta de IP por nova sessão de visitante cobre esse recurso. É uma única requisição guardada em cache durante a visita, o que mantém uma loja virtual movimentada bem dentro das 2.500 requisições gratuitas por dia incluídas em cada chave.
Acertar o "aberto agora" para um público global é questão de uma consulta e de uma comparação de horário simples, e não de um recurso complicado. A documentação de consulta IPv4 lista o formato completo da resposta.