从时间轨道数组中排除时间



Rails5.x

这是一个预约系统,每15分钟显示一次所有可用时间(步骤(。

start_time = '2:00 pm'.to_time
> 2020-10-26 14:00:00 +1100

end_time = '5:00 pm'.to_time
> 2020-10-26 17:00:00 +1100

我每15分钟得到一次可用时间

(start_time.to_i..end_time.to_i).to_a.in_groups_of(15.minutes).collect(&:first).collect { |t| Time.at(t) }  
[2020-10-26 14:00:00 +1100,
2020-10-26 14:15:00 +1100,
2020-10-26 14:30:00 +1100,
2020-10-26 14:45:00 +1100,
2020-10-26 15:00:00 +1100,
2020-10-26 15:15:00 +1100,
2020-10-26 15:30:00 +1100,
2020-10-26 15:45:00 +1100,
2020-10-26 16:00:00 +1100,
2020-10-26 16:15:00 +1100,
2020-10-26 16:30:00 +1100,
2020-10-26 16:45:00 +1100,
2020-10-26 17:00:00 +1100
] 

我想排除不可用的时间。例如:

2:30 to 3pm 
3:15 to 4pm 

有什么好办法解决这个问题吗?

不确定这是否算漂亮,但。。。

interval = 15.minutes
start_time = '2:00 pm'.to_time
end_time = '5:00 pm'.to_time
taken = [
'2:30 pm'...'3:00 pm',
'3:15 pm'...'4:00 pm'
]
def slots(start_time, end_time, interval)
(start_time.to_i..end_time.to_i).
to_a.
in_groups_of(interval).
collect(&:first).
collect { |t| Time.at(t) }
end
def taken_slots(interval, taken)
taken.collect { |r|
slots(
r.begin.to_time,
r.end.to_time - (r.exclude_end? ? interval : 0),
interval
)
}.flatten
end
def available_slots(start_time, end_time, interval, taken)
slots(start_time, end_time, interval) - taken_slots(interval, taken)
end
available_slots(start_time, end_time, interval, taken)

给出

[
2020-10-26 14:00:00 +0000,
2020-10-26 14:15:00 +0000,
2020-10-26 15:00:00 +0000,
2020-10-26 16:00:00 +0000,
2020-10-26 16:15:00 +0000,
2020-10-26 16:30:00 +0000,
2020-10-26 16:45:00 +0000,
2020-10-26 17:00:00 +0000
]

我认为,如果你需要让插槽更快,下面的miiiiight帮助(虽然没有经过测试,也不确定间隔的不同值可能会起到什么作用(。。。

def slots(start_time, end_time, interval)
((start_time.to_i/interval)..(end_time.to_i/interval)).
to_a.
collect { |t| Time.at(t * interval) }
end

编辑:

上述更快的插槽在不同的开始和结束时间下的表现似乎与原来的插槽不同,所以也许可以忽略这一点。

(示例:(

interval = 15.minutes
start_time = '2:01 pm'.to_time
end_time = '5:00 pm'.to_time
def slots(start_time, end_time, interval)
(start_time.to_i..end_time.to_i).
to_a.
in_groups_of(interval).
collect(&:first).
collect { |t| Time.at(t) }
end
def slots_f(start_time, end_time, interval)
((start_time.to_i/interval)..(end_time.to_i/interval)).
to_a.
collect { |t| Time.at(t * interval) }
end

slots(start_time,end_time,interval(=>

[
2020-10-26 14:01:00 +0000,
2020-10-26 14:16:00 +0000,
2020-10-26 14:31:00 +0000,
2020-10-26 14:46:00 +0000,
2020-10-26 15:01:00 +0000,
2020-10-26 15:16:00 +0000,
2020-10-26 15:31:00 +0000,
2020-10-26 15:46:00 +0000,
2020-10-26 16:01:00 +0000,
2020-10-26 16:16:00 +0000,
2020-10-26 16:31:00 +0000,
2020-10-26 16:46:00 +0000
]

slots_f(start_time,end_time,interval(=>

[
2020-10-26 14:00:00 +0000,
2020-10-26 14:15:00 +0000,
2020-10-26 14:30:00 +0000,
2020-10-26 14:45:00 +0000,
2020-10-26 15:00:00 +0000,
2020-10-26 15:15:00 +0000,
2020-10-26 15:30:00 +0000,
2020-10-26 15:45:00 +0000,
2020-10-26 16:00:00 +0000,
2020-10-26 16:15:00 +0000,
2020-10-26 16:30:00 +0000,
2020-10-26 16:45:00 +0000,
2020-10-26 17:00:00 +0000
]

最新更新