Время открытия / закрытия магазина и изменения летнего времени - PullRequest
0 голосов
/ 08 октября 2010

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

Я объясню мою систему для лучшего ответа.

Этот сайт продает "товары", но может продавать только в открытые и закрытые часы. В магазинах могут быть разделены часы: то есть: открыты с 8 утра до 12 вечера с 13:00 до 20:00 ... и т. Д.

Итак, мой рабочий стол выглядит так:

id (1) | store_id (1) | opens (08:00) | closes (21:00)

Выше приведены примеры данных рядом с именем столбца. Обычно идентификатор магазина № 1 может быть в Лос-Анджелесе (США / Тихоокеанский регион) или в Нью-Йорке (США / Восточный).

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

Кто-нибудь имел дело с этим? И если да, то как ты это сделал?

Как лучше всего решить эту проблему. Я имел дело с этим, и он съел мой мозг в течение прошлых 48 часов.

Пожалуйста, помогите! :)

Ответы [ 2 ]

0 голосов
/ 01 февраля 2011

На самом деле это очень легко сделать в Postgres и MySQL.Все, что вам нужно сделать, это сохранить часовой пояс на стороне пользователя, установить для сервера TZ значение UTC, а затем выполнить преобразование между ними.

EX:

SELECT 
    CASE WHEN (
        (CAST((CURRENT_TIMESTAMP at time zone s.timezone) as time) BETWEEN h.opens AND h.closes) AND 
        h.day = extract(dow from CURRENT_TIMESTAMP at time zone s.timezone)) THEN 0 ELSE 1 END
    ) as closed 
FROM store s 
LEFT JOIN store_hours r ON s.id = r.store_id 
HERE h.day = extract(dow from CURRENT_TIMESTAMP at time zone s.timezone)

Это что-то вроде этого.Мне приходилось делать это так, потому что я был ограничен в использовании Doctrine 1.2.

Работает как талисман даже при изменениях летнего времени.

0 голосов
/ 11 октября 2010

Следует иметь в виду, что в некоторых местах (например, в Аризоне) DST не проводится.Возможно, вы захотите убедиться, что в вашей базе данных достаточно информации, чтобы вы могли различить LA и Phoenix, если это окажется необходимым.

Предполагая, что вы следуете совету ITroubs и внесете коррективы в базу данных (и, возможно, информацию о том,хранилище находится в DST-уважаемой локали), вы можете сделать следующее:

Создать свой код, чтобы он проверял, действует ли DST, и правильно строит ваши запросы.Если все ваши магазины находятся в Нью-Йорке и Лос-Анджелесе, вы можете просто добавить 1 к смещению, когда это необходимо.Если нет, вам понадобится запрос, который использует разные правила для хранилищ DST и не-DST.Что-то вроде:

SELECT store_id
FROM hours
WHERE
(supportsDST = true AND opens < dstAdjustedNow AND closes > dstAdjustedNow) 
OR (supportsDST = false AND opens < UTCNow AND closes > UTCNow)

Если вы идете по этому пути, я рекомендую попытаться как можно больше централизовать и изолировать код, который занимается этим.

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

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