【问题标题】:Scheduling events, and having events cross midnight安排活动,让活动跨越午夜
【发布时间】:2013-05-27 00:55:56
【问题描述】:

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

目前,我使用以下列将这些广播存储在 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 点。

我在以下两个问题上遇到了一些严重的问题:

  • 只能在特定时间的特定时间安排一个广播 渠道。应用需要验证用户输入,并检查是否有 存在特定频道和时间的广播。

  • 应用程序需要显示当前显示的广播,如果有的话,每个 三个频道中。基本上,对于每个频道,找到一个广播 开始时间

我完全不确定使用时间字段作为开始/结束时间是否是最佳解决方案。请记住,我需要存储时间值,而不是日期,因为在系列期间每周二都会进行广播。

您将如何存储这些广播,允许在特定时间进行验证和查询,允许广播“跨越”午夜?

【问题讨论】:

    标签: mysql ruby-on-rails time schedule period


    【解决方案1】:

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

    【讨论】:

    • 我研究了ice_cube,它看起来很有希望。不幸的是,它只处理表达规则,而不是存储或验证它们。为数据库中的每个事件构建一个包含规则的时间表并不是一个真正的选择,因为可能有数百个事件。
    【解决方案2】:

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

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

    验证同样简单。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多