如何处理经常性的时间?

时间:2011-06-21 15:33:07

标签: algorithm language-agnostic

首先,我将此问题标记为语言不可知,但我使用的是PHP和MySQL。它本身不应该影响问题本身。

我正在创建一个应用程序,在整个星期显示某些节目的时间。每一个节目都是经常性的(每周一次)并且可能会有节目播出2天 - 例如。周日23:30开始,周一00:30结束。我正在存储节目的开头(星期几,星期一,星期二...... - 它不是确切的日期;时间)和持续时间。从来没有节目需要超过24小时。

我的问题在于验证新添加的节目是否与某些旧节目重叠。特别是如果涉及周日 - 周一节目。

如何在数据库端和服务器端处理此类重复事件?

tl;博士版本我考虑过的东西

我的第一个想法是创建一些自定义验证算法,但它看起来太麻烦和复杂。并不是说我会抱怨复杂的手工制作的解决方案,但如果没有更基本的东西,我很感兴趣。

我想到的其他替代方案是将表结构更改为使用datetime(而不是“day of week”和“time”),并使用假的固定日期范围来存储数据。例如,所有星期一将设置为1970年1月5日,星期日将使用1970年1月11日。这个规则将有一个例外 - 如果有一些节目从星期日开始到周一结束,它将被存储为1月12日这个解决方案允许比原始数据库更灵活地查询数据库,并且还可以简化对各个周之间重叠的节目的查询(因为我们可以直接在查询中进行比较)。这个解决方案也存在一些缺点(例如,使用假日期可能会让人感到困惑)。

这两种解决方案对我来说都是错误算法的味道,并且希望听到来自更有经验的开发人员的一些意见。

3 个答案:

答案 0 :(得分:6)

听起来你可以将每个节目的起始分钟存储为自本周开始以来的整数分钟数(10,080个可能的值)。

当且仅当<{p}}时,以$a分钟开始的节目$dur_a将重叠$b

(10080 + $b - $a) % 10080 < $dur_a

例如,考虑一个节目从星期日晚上11点开始,另一个节目从星期一的12:30开始。这里有$a == 10020$dur_a == 120以及$b == 30(10080 + $b - $a) % 10080 == 90。这小于$dur_a,因此节目重叠。

答案 1 :(得分:1)

通过将数据转换为适合所需计算的格式,可以简化此问题。我建议创建一个表示开始时间的类型,作为从星期日午夜开始的分钟数。然后可以使用简单的整数范围比较来查找重叠的节目。

当然,内部陈述必须隐藏和抽象。例如,您可能在某些时候想要将表示从几分钟更改为几秒钟。

答案 2 :(得分:0)

我会选择自定义验证算法:

  • 对于每个节目,计算所有显示间隔[start1, end1], [start2, end2], ... [startN, endN],其中N是节目的重现次数。
  • 对于新节目,还要计算这些间隔。
  • 现在检查这些新间隔是否与任何旧间隔相交。如果一个间隔的开始或结束包含在另一个间隔中,则会出现这种情况。