2010-10-08 48 views
0

我一直坚持这两天,并没有得到任何地方。我倾向于考虑未来和将来出现的问题。我的服务器的时间设置为UTC,并且linux盒子完全更新了时区以及数据在我的数据库中。店铺打开/关闭时间和DST变化

我会解释我的系统的最佳答案。

本网站出售“物品”,但只能在开放和封闭时间销售。该商店可以有分裂时间:即:从8 AM-12PM 1 pm-8pm开...等

所以我的时间表如下所示:

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

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

确保我不会错过一小时停机时间的最佳方式是什么,以便我可以阻止用户在下班时间从这些商店订购。如果我的时间不是一小时,那么一个小时,当他们真正开放时,没有人可以订购,一小时内用户会在他们真正关闭时订购。反之,根据时间的变化。

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

什么是我可以去解决这个问题的最佳途径。我一直在处理它,在过去的48小时里它正在吃掉我的大脑。

请帮忙! :)

+0

已经尝试设置像offsetHour(+1)这样的偏移量,因此您可以花费一些时间,如SELECT打开+ offsetHour AS'打开'FROM小时 – ITroubs 2010-10-08 08:23:49

+0

另一种解决方案是从cloudemade等地理系统请求时区,计算offsetHour该时区并将其存储在您的数据库中 – ITroubs 2010-10-08 08:25:49

回答

0

在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而受到限制。

即使有DST变化,它也可以像魅力一样工作。

0

有一点要记住的是,有些地方(认为亚利桑那州)不要做DST。你可能想确保你的数据库有足够的信息,这样你就可以区分洛杉矶和菲尼克斯,如果有必要的话。

假设你遵循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) 

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

此外,您不提这一点,但我认为具有拆分时间的商店在小时表中会有两行,每个块都有一行打开。