0

我已经被困在这两天了,没有得到任何地方。我倾向于思考未来和未来会出现的问题。我的服务器时间设置为 UTC 并且 linux 框已完全更新时区以及数据在我的数据库中。

我将解释我的系统以获得最佳答案。

该网站出售“物品”,但只能在开放和关闭时间出售。商店可以有不同的营业时间:即:营业时间为上午 8 点至下午 12 点、下午 1 点至晚上 8 点......等。

所以我的小时表看起来像:

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

上面有列名旁边的示例数据。基本上,商店 id#1 可能位于洛杉矶(美国/太平洋),也可能位于纽约市(美国/东部)。

什么是确保我不会错过一小时停机时间的最佳方法,这样我就可以禁止用户在下班时间从这些商店订购。如果我不在时间一小时,那就是一小时没有人可以在真正开放时订购,而一小时用户将在真正关闭时订购..反之亦然,具体取决于时间变化。

有没有人处理过这个?如果是这样,你是怎么做到的?

我可以解决此问题的最佳方法是什么。我一直在处理它,它在过去的 48 小时里吞噬了我的大脑。

请帮忙!:)

4

2 回答 2

0

要记住的一件事是有些地方(想想亚利桑那州)不做夏令时。您可能希望确保您的数据库有足够的信息,以便在必要时区分 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)

如果你走这条路,我建议尽量集中和隔离处理这个问题的代码。

另外,您没有提到这一点,但我假设具有拆分时间的商店在小时表中将有两行,一个用于它打开的每个块。

于 2010-10-11T07:26:03.457 回答
0

它实际上在 Postgres 和 MySQL 中非常容易实现。您所要做的就是将时区存储在用户端,将服务器 TZ 设置为 UTC,然后在两者之间进行转换。

前任:

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 方面受到限制。

即使 DST 更改,也能像魅力一样工作。

于 2011-02-01T08:21:31.047 回答