使用START_TIME和END_TIME与ice_cube宝石单事件发生(Single occur

2019-08-03 17:49发布

必须有简单的东西在这里被忽略...

我一直在试图创建一个基本的各种方法IceCube时间表( https://github.com/seejohnrun/ice_cube )。 总的目标是使用IceCube ,让一个“客房预订”里面的“价格明细表” Rails应用程序。

第一种方案是创建一个基本的schedule与具体start_timeend_time -只发生一次。 IceCube可以做到这一点,对不对?

该计划将开始在start_time在和结束end_time 。 我希望能够检查的日期或时间occurs_on? 这个时间表,以确定是否一个房间的价格应进行调整。

因此,在控制台我试着建立一个基本的时间表,并希望它是发生5.days从现在开始,因为start_timeTime.nowend_timeTime.now + 30.days 。 但它似乎永远返回true ...

1.8.7 :001 > schedule = IceCube::Schedule.new(Time.now, :end_time => Time.now + 30.days)
 => #<IceCube::Schedule:0xb619d604 @all_recurrence_rules=[], @duration=nil, @end_time=Tue Jan 08 09:13:11 -0600 2013, @all_exception_rules=[], @start_time=Sun Dec 09  09:13:11 -0600 2012> 
1.8.7 :002 > schedule.occurs_on? Date.today + 5.days
 => false 
1.8.7 :005 > schedule.occurs_at? Time.now + 5.days
 => false 
1.8.7 :006 > schedule.occurring_at? Time.now + 5.days
 => false 

添加重复规则

1.8.7 :018 > schedule.rrule IceCube::Rule.monthly
=> [#<IceCube::MonthlyRule:0xb687a88c @validations={:base_day=>[#<IceCube::Validations::ScheduleLock::Validation:0xb6875b0c @type=:day>], :base_hour=>[#<IceCube::Validations::ScheduleLock::Validation:0xb6875abc @type=:hour>], :interval=>[#<IceCube::Validations::MonthlyInterval::Validation:0xb6875d28 @interval=1>], :base_min=>[#<IceCube::Validations::ScheduleLock::Validation:0xb6875a6c @type=:min>], :base_sec=>[#<IceCube::Validations::ScheduleLock::Validation:0xb6875a1c @type=:sec>]}, @interval=1>] 

然后检查Date.today作品...

1.8.7 :025 > schedule.occurs_on? Date.today
 => true 

但检查occurs_on? 对于Date.today + 10.days仍然返回false,为什么?

1.8.7 :026 > schedule.occurs_on? Date.today + 10.days
 => false 

那么,我可以俯瞰/做错了吗? 或什么是设置一个点IceCube::Schedule start_timeend_time -他们似乎没有任何效果......?

难道IceCube不是有开始和结束时间只发生一次的事件工作?

另一个例子场景,房间主人要提出一个假期的房间价格。 所以房间主人将创建开始于2012年12月1日,结束01月07日2013年一个价格表(不应该再次发生,但可以如果车主想要的)。

然后,当人们正在寻找的房间,价格是,如果要求住宿调整occurs_on? 节日价格表

我需要存储start_timeend_time计划之外,并手动或什么检查呢?

还是有更适合的宝石/工具,以协助这种进度管理的?

Answer 1:

你误会日程和规则是如何工作的。

首先,要了解是很重要的start_time 。 计划的每一个发生在此基础上,并计划返回匹配从开始时间特定的时间间隔是时间。 间隔由规则所决定。

您的例子不工作,因为“从现在起5日”是不是从计划的开始时间的月间隔。 从开始时间28,30,天或31天将匹配,取决于月份。

start = Time.utc(2013, 05, 17, 12, 30, 00) # 2013-05-17 12:30:00 UTC
schedule = IceCube::Schedule.new(start)
schedule.add_recurrence_rule IceCube::Rule.monthly

schedule.occurs_on? start + 5.days #=> false
schedule.occurs_on? start + 31.days #=> true

其次, end_time与一起工作start_time设定每次出现的持续时间。 所以,如果您的开始时间为09:00,而结束时间是17:00,然后每次出现都会有8个小时的时间。

这就造成了区分occurs_at?(t1)occurring_at?(t1)当给定的时间内发生的开始完全匹配的第一个是唯一真正的; 第二个是在持续时间的任何时间真。 occurs_on?(d1)在指定日期的任何时间匹配。

arrival = Time.utc(2013, 5, 1,  9, 0, 0)
departure  = Time.utc(2013, 5, 1, 17, 0, 0)
schedule = IceCube::Schedule.new(arrival, end_time: departure)
schedule.add_recurrence_rule IceCube::Rule.weekly.day(1, 2, 3, 4, 5) # M-F

schedule.occurs_at? arrival            #=> true
schedule.occurs_at? arrival + 1.second #=> false

schedule.occurring_at? arrival + 1.second   #=> true
schedule.occurring_at? departure + 1.second #=> false

对于你在做什么,你可以尝试以下两种方法之一:

  1. 单月之久的发生
  2. 每天都在发生一个月后结束

这取决于你需要如何按日程显示或验证时间。 这里有两个例子:

arrival = Time.utc(2013, 5, 1)
departure = Time.utc(2013, 5, 31)

# single occurrence
schedule = IceCube::Schedule.new(arrival, duration: 31.days)

# daily occurrence
schedule = IceCube::Schedule.new(arrival, duration: 1.day)
schedule.add_recurrence_rule IceCube::Rule.daily.until(departure)


Answer 2:

一些更多的测试后,我想到了用冰块的SingleOccurrenceRule是有一个事件的单个事件的正确方法。

有只发生在计划之间的天日程start_timeend_time我可以这样做以下。

创建一个IceCube::Schedule有开始和END_TIME:

1.8.7 :097 > schedule = IceCube::Schedule.new(Time.now, :end_time => Time.now + 30.days)
 => #<IceCube::Schedule:0xb63caabc @all_recurrence_rules=[], @duration=nil, @end_time=Wed Jan 09 00:03:36 -0600 2013, @all_exception_rules=[], @start_time=Mon Dec 10 00:03:36 -0600 2012> 

把所有的时间表内发生到一个数组的日子。

1.8.7 :098 > days_in_schedule = []
 => [] 
1.8.7 :099 > schedule.start_time.to_date.upto(schedule.end_time.to_date) { |d| puts d; days_in_schedule << d }

遍历数组,并为每一天的日程创建SingleOccurrenceRule。 然后测试了几个日期。 在30天里,occurs_on? 诚然,30天外,occurs_on? 是假的。 这似乎是正确的,但它检查是否仍时返回false schedule.occurs_on? Date.today schedule.occurs_on? Date.today为什么?!?!?

1.8.7 :100 > days_in_schedule.each { |d| schedule.rtime Time.parse(d.to_s) }
1.8.7 :109 > schedule.terminating?
 => true 
1.8.7 :110 > schedule.occurs_on? Date.today + 5.days
 => true 
1.8.7 :111 > schedule.occurs_on? Date.today + 55.days
 => false 
1.8.7 :135 > schedule.occurs_on? Date.today
 => false 


文章来源: Single occurrence event with ice_cube gem using start_time and end_time