在 Ruby 中是否有可用的宝石SQL TIME
(00:00:00...23:59:59)。现在它被转换为一个日期时间对象,这绝对不是我想要的。我想检查某个时间是否包含在时间范围内。
到目前为止,我最好的解决方案是将其转换为 ruby(0...235959) 中的整数并与之对抗,但我想知道是否有更好的解决方案。
我想将它用于订阅应用程序,人们可以订阅通知并说他们希望在例如 7:00 到 18:30 之间接收通知
在最一般的情况下,如果没有一些痛苦,那是行不通的。面对夏令时,“午夜加 2 小时 15 分钟”的值并不确定。在春季变化的早晨,“02:15AM”不是有效时间。
您可以通过禁止在午夜和凌晨 4:00 之间的时间来回避这个问题。
如果您不使用数据库,则可以将 24 小时时间存储为规范格式的字符串。规范字符串可以直接比较相等和不等,您可以通过将它们与任意日期连接并使用 Ruby 的本机 Date 方法来对它们进行简单的算术运算。
或者您可以构建一个实现您喜欢的任何“时间”接口的类。
Gems:ice_cube 和 tickle 听起来像是针对您的问题空间,但我没有使用它们。
听起来这里的主要问题是 SQL 时间字符串格式和 Ruby 的 datetime 对象之间的区别。
我认为你需要的是DateTime#strftime
和DateTime#strptime
方法。例如,要从 DateTime 对象d
转到 SQL 字符串,您将使用d.strftime('%H:%M:%S')
,而要从字符串s
转到 DateTime,您将使用DateTime.strptime(s, '%H:%M:%S')
.
编辑:我知道。我是说,由于您无法以 sql 使用的字符串格式进行这些计算,因此您可以将其转换为 DateTime 或 Time 对象,并为您在 7:00 到 18:30 之间的示例执行类似的操作:
time = DateTime.strptime(<sql output string>, '%H:%M:%S')
start_time, end_time = DateTime.strptime('07:00:00', '%H:%M:%S'), DateTime.strptime('18:30:00', '%H:%M:%S')
(start_time..end_time).cover? time