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

时间:2018-06-07 06:06:35

标签: ruby-on-rails ruby postgresql date time

我有两个时间列存储在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时,它无法正常工作。

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

4 个答案:

答案 0 :(得分:4)

也许你想要这样的东西:

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

答案 1 :(得分:4)

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")
  #=> #<DateTime: 2018-06-07T09:00:00+00:00 ((2458277j,32400s,0n),
  #               +0s,2299161j)>
close_time = DateTime.parse("17:00")
  #=> #<DateTime: 2018-06-07T17:00:00+00:00 ((2458277j,61200s,0n),
  #               +0s,2299161j)>

然后

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")
  #=> #<DateTime: 2018-06-07T01:00:00+00:00 ((2458277j,3600s,0n),
  #               +0s,2299161j)>

然后

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

答案 2 :(得分:2)

您可以使用

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

这只会给你datetime而不是你必须开始的完整curtime() between值,这就是你想要的。

然后,您可以使用与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 相同的逻辑来获取您要查找的获取值。

示例:

datetime

Working SQL Fiddle

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

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

答案 3 :(得分:0)

您可以利用范围以及如何比较数字字符串

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'))