找出当前时间是否介于两次之间

我有两个时间列存储在Postgresql数据库中: open_timeclose_time 。 我试图找出当前时间,忽略日期,是否在两次之间,忽略了日期。

此代码比较日期和时间:

 current_time = Time.now if current_time.between?(store.open_time, store.close_time) puts "IN BETWEEN" end 

例如,当current_time # => 2018-06-06 23:59:49 -0600open_time # => 2000-01-01 22:59:00 UTC时,它不起作用。

如何让它不包括日期,只是比较时间?

也许你想要这样的东西:

 current_time = Time.now open_time = store.open_time close_time = store.close_time current_time -= current_time.beginning_of_day open_time -= open_time.beginning_of_day close_time -= close_time.beginning_of_day if current_time.between?(open_time, close_time) puts "IN BETWEEN" end 

要么

 current_time = Time.now open_time = store.open_time close_time = store.close_time current_time = [current_time.hour, current_time.min, current_time.sec] open_time = [open_time.hour, open_time.min, open_time.sec] close_time = [close_time.hour, close_time.min, close_time.sec] if open_time <=> current_time == -1 and current_time <=> close_time == -1 puts "IN BETWEEN" end 
 require 'time' TIME_FMT = "%H%M%S" def store_open_now?(open_time, close_time) nt = Time.now.strftime(TIME_FMT) ot = open_time.strftime(TIME_FMT) ct = close_time.strftime(TIME_FMT) ot <= ct ? (nt >= ot && nt <= ct) : (nt >= ot || nt <= ct) end 

在我写的时候,时间现在是午夜过了约32分钟。

 Time.now.strftime(TIME_FMT) #=> "003252" 

假设

 open_time = DateTime.parse("09:00") #=> # close_time = DateTime.parse("17:00") #=> # 

然后

 open_time.strftime(TIME_FMT) #=> "090000" close_time.strftime(TIME_FMT) #=> "170000" store_open_now?(open_time, close_time) #=> false 

现在假设开放时间相同,但关闭时间稍晚。

 close_time = DateTime.parse("01:00") #=> # 

然后

 close_time.strftime(TIME_FMT) #=> "010000" store_open_now?(open_time, close_time) #=> true 

你可以使用CAST()你的datetime time

 cast(tbl_store.open_time as time) as SomeVariable cast(tbl_store.close_time as time) as SomeOtherVariable 

那只会给你time而不是你必须开始的完整datetime值,这就是你想要的。

然后,您可以在curtime() between使用与您要curtime() between的get值相同的逻辑。

例:

 SELECT CAST(tbl_store.open_time as TIME) as open_time, CAST(tbl_store.close_time as TIME) as close_time, CURTIME() BETWEEN (cast(tbl_store.open_time as TIME)) AND (cast(tbl_store.close_time as TIME)) as time_between FROM tbl_store 

工作SQL小提琴

您可以更改小提琴中的架构构建以测试所需的datetime值。

请注意,如果您有一个包含午夜时间的逻辑,则必须对该逻辑进行CASE WHEN逻辑,否则它将失败并返回0,而它应返回1。

您可以利用范围以及数字字符串的比较方式

 r = Range.new('09:00', '18:00') r.include?('08:59') # => false r.include?('09:01') # => true r.include?('18:01') # => false 

然后我们可以使用

 open_hours_range = Range.new(open_time.strftime('%R'), close_time.strftime('%R')) shop_open? = open_hours_range.include?(Time.now.strftime('%R'))