Смещения часового пояса (и изменения st / dst) в MySQL / PHP - PullRequest
1 голос
/ 07 октября 2010

В основном у меня есть сайт, который позволяет магазинам хранить время их открытия / закрытия.

Теперь я пытаюсь добавить функцию, позволяющую посетителям видеть, закрыт ли магазин.

Я понимаю, что могу выполнить запрос вроде:

SELECT * FROM `store_hours` WHERE TIME(NOW()) BETWEEN `opens` AND `closes`

... и запрос работает и извлекает магазины, которые в данный момент открыты. Однако сначала этот запрос не учитывал часовой пояс магазина.

ТАК .. Я решил сохранить время открытия / закрытия магазина с привязкой к конвертации в UTC:

id | store_id | открывает | закрывается | utc_opens | utc_closes

Теперь я могу запросить примерно так:

SELECT * FROM `store_hours` WHERE TIME(NOW()) BETWEEN `utc_opens` AND `utc_closes`

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

Теперь я пришел к этой проблеме. Через PHP все, что я делал, это добавлял смещение к отметке времени:

date('H:i', strtotime($values['closes']) + $offset)

Затем я начал думать о тихоокеанском стандартном времени, а затем о летнем времени.

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

Ответы [ 2 ]

2 голосов
/ 07 октября 2010

Я никогда раньше не занимался этим (да и не хочу, потому что это очень сложная проблема). Тем не менее, есть способы обойти это:

как вы справляетесь с проблемами часовых поясов?

Кажется, что если вы хотите, чтобы ваша система работала не идеально, но, черт возьми, вам придется погрузиться в нечто вроде этого:

http://en.wikipedia.org/wiki/Zoneinfo

Короче говоря, проблема заключается в гранулярной сложности. Как бы вы ни старались, вы не можете написать простой скрипт, который будет определять точное время магазина с учетом только статического смещения по Гринвичу. Чтобы преодолеть эту проблему, люди собрали общедоступные базы данных, которые учитывают (почти) все маленькие закоулки, присущие часовым поясам. Даже если вы знаете, что пользователь находится в западной части США (к западу от Скалистых гор), вы не знаете, находится ли он в Барстоу или Фениксе (Аризона не проводит летнее время, поэтому пол года у него столько же времени, сколько в Лос-Анджелесе а другая половина - такая же, как Денвер).

Итак, вернемся к вводу данных ... вам просто нужно ввести точный код часового пояса для каждого хранилища и запросить эту базу данных zoneinfo, чтобы определить текущее смещение.

0 голосов
/ 07 октября 2010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...