2

在 Ruby 中是否有可用的宝石SQL TIME(00:00:00...23:59:59)。现在它被转换为一个日期时间对象,这绝对不是我想要的。我想检查某个时间是否包含在时间范围内。

到目前为止,我最好的解决方案是将其转换为 ruby​​(0...235959) 中的整数并与之对抗,但我想知道是否有更好的解决方案。

我想将它用于订阅应用程序,人们可以订阅通知并说他们希望在例如 7:00 到 18:30 之间接收通知

4

2 回答 2

0

在最一般的情况下,如果没有一些痛苦,那是行不通的。面对夏令时,“午夜加 2 小时 15 分钟”的值并不确定。在春季变化的早晨,“02:15AM”不是有效时间。

您可以通过禁止在午夜和凌晨 4:00 之间的时间来回避这个问题。

如果您不使用数据库,则可以将 24 小时时间存储为规范格式的字符串。规范字符串可以直接比较相等和不等,您可以通过将它们与任意日期连接并使用 Ruby 的本机 Date 方法来对它们进行简单的算术运算。

或者您可以构建一个实现您喜欢的任何“时间”接口的类。

Gems:ice_cube 和 tickle 听起来像是针对您的问题空间,但我没有使用它们。

于 2013-08-20T13:27:43.327 回答
-1

听起来这里的主要问题是 SQL 时间字符串格式和 Ruby 的 datetime 对象之间的区别。

我认为你需要的是DateTime#strftimeDateTime#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
于 2013-08-20T14:29:23.187 回答