安排事件,并使事件跨越午夜

我正在Ruby on Rails中构建一个电视连续剧调度应用程序,它根据当前在电视上的内容执行某些操作。 用户可以创建一个具有开始和结束日期的系列,并可以为这些系列创建广播。 广播可以在三个频道中的一个频道上,并且是“每周二,在频道2,从10:00:00到14:00:00”的forms。

目前,我将这些广播存储在MySQL中,其中包含以下列: wday整数, starts_atends_at时间字段以及channel_id整数。 因此,上述广播将与wday 2, channel_id 2, starts_at “10:00:00”和ends_at “14:00:00”一起存储,并且引用它所属的事件。 广播可以在午夜“交叉”,因此应用程序应该允许广播以“23:00:00”开始并结束“02:00:00”,第二天早上2点。

我遇到以下两个问题时遇到了严重问题:

  • 在特定频道上的特定时间只能安排一个广播。 该应用程序需要validation用户输入,并检查特定频道和时间是否存在广播。

  • 应用程序需要显示三个频道中每个频道的当前显示的广播(如果有)。 基本上,对于每个频道,使用starts_at <当前时间<ends_at查找广播。 显然,这也需要与午夜过夜的广播一起工作。

我完全不确定在开始/结束时间使用时间字段是否是最好的解决方案。 请记住,我需要存储时间值,而不是日期,因为广播可以在系列期间每周二发生。

你将如何存储这些广播,允许validation并允许在特定时间内查询,允许广播“跨越”午夜?

这种问题是边缘情况的雷区,我总是将逻辑委托给IceCube( https://github.com/seejohnrun/ice_cube )。 这是为了处理这些重复的时间表,并提供简单的序列化支持等。即使它需要重新思考你如何做事,我强烈建议使用它。

足够公平 – 然后你应该将开始/结束时间存储为星期一(或每当)午夜后的秒。 然后,您可以使用访问器/设置器将数据转换为人类可解析的格式。 查找当前显示的程序变得如此简单:

 time_now = 18494 Program.where 'start_time >= ? AND end_time < ?', time_now, time_now 

validation同样简单。

那么使用Unix / epoch时间戳,并创建一些业务逻辑,一旦完成所有的检查和计算,将其转换为漂亮的日期(应该可以在某处开箱即用)? 这样看起来你可以避免很多午夜和其他日期相关的问题……