2015-07-21 7 views
1

Мне нужна функция «открыта сейчас» php на сайте, который я создаю. Глядя на предыдущий question, я построил мой MySQL таблицу:Функция «Открыть сейчас», специфичная для часового пояса

hours_id  INT   NOT NULL, 
loc_id  INT   NOT NULL, 
dow   TINYINT  NOT NULL, 
open_time  TIME  NOT NULL, 
close_time TIME  NOT NULL, 

Затем с помощью:

"SELECT open_time, close_time 
FROM opening_hours 
WHERE dow=dayofweek(curdate()) 
    AND loc_id=:loc_id" 

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

Я уже сохраняю код страны и lat/lng местоположения в связанном db, поэтому мои мысли состоят в том, что я получаю часовой пояс от этого или предоставляю метод для пользователя, чтобы выбрать его, а затем изменить мой SQL как-то.

Я направляюсь в правильном направлении? Каким будет ваш метод?

+0

Вы рассматривали 'AND NOW() между open_time AND close_time' – RiggsFolly

+0

@RiggsFolly Да, но это будет только сравнивать часы с сервером, и мне нужно знать, открыто ли местоположение в их часовом поясе, а не в часовом поясе сервер находится в (местоположения по всему миру). Я чувствую, что мне нужно получить часовой пояс местоположения, сохранить его и настроить время моего сервера до проверки SQL. Просто не уверен, что это лучший метод. – Paul

ответ

2
  1. Читайте о time zone support in MySQL и убедитесь, что ваша база данных mysql настроена с учетом текущих таблиц часовых поясов. Обновляйте регулярно.

  2. Свяжите каждое место с указанным часовым поясом IANA/Olson, например "America/Los_Angeles", или "Europe/London". См. the list here. Если у вас есть lat/lon, вы можете найти часовой пояс через one of these methods.

  3. Используйте функцию MySQL CONVERT_TZ для преобразования текущего времени UTC в определенную зону. Например, CONVERT_TZ(UTC_TIMESTAMP(),'UTC','Asia/Tokyo')

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

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

Еще один подход, который будет выполнять, но требует больше усилий, заключается в том, чтобы заранее определить время запуска и остановки UTC в течение некоторого времени в будущем (по крайней мере, до следующего, но, возможно, и далее). Затем вы можете отсканировать этот список с временем UTC. Это работает лучше в масштабе, когда у вас есть тысячи или более отдельных записей для проверки. Но в меньших масштабах это обычно не стоит накладных расходов.

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

+0

Удивительный ответ и отличное объяснение относительно того, почему не хранить UTC (я рассматривал это).Я займу немного времени и рассмотрю вариант масштабирования - я не запустил его, чтобы он, возможно, не стоил того, но в то же время я нахожусь на 10 000 мест, поэтому, возможно, мне стоит поместить это время сейчас. Еще раз спасибо, очень благодарен. – Paul

Смежные вопросы