如何将ice_cube gem 用于同时具有开始和结束时间的项目(事件)(例如:周一、周三、周五 @ 10pm-11:30pm EST)?
我目前以 UTC 格式将所有时间存储在数据库中。因此,对于上面的示例,该项目如下所示:
#<Item recurring: {:validations=>{:day=>[1, 3, 5]}, :rule_type=>"IceCube::WeeklyRule", :interval=>1, :week_start=>0}, start_time: "2017-11-21 03:00:00", end_time: "2017-12-24 04:30:00"">
如果我想查看该项目是否出现在两次之间的日期,我正在尝试这样做:
item.schedule(item.start_time).occurs_between?(some_start_time, some_end_time)
不幸的是,如果我在(Mon @ 10pm EST) 和( Mon @ 11:30 EST)false
传递,这将返回。我相信那是因为宝石只会显示周一、周三、周五与我设置的规则的冲突?some_start_time
Tue, 28 Nov 2017 03:00:00 UTC +00:00
some_end_time
Tue, 28 Nov 2017 04:30:00 UTC +00:00
ice_cube
我觉得我错过了关于宝石的一些基本知识。如何正确计算时区?我认为最终目标是,如果我让用户从晚上 10 点到晚上 11:30 选择周一、周三、周五,我需要它将重复存储为周二、周四、周六凌晨 3 点到凌晨 4 点 30 分。
这是我Item
在 Rails 中实现课程的方式。
class Item
serialize :recurring, Hash
def recurring=(value)
RecurringSelect.is_valid_rule?(value) ? super(RecurringSelect.dirty_hash_to_rule(value).to_hash) : super(nil)
end
def rule
IceCube::Rule.from_hash(recurring)
end
def schedule(start)
schedule = IceCube::Schedule.new(start)
schedule.add_recurrence_rule(rule)
schedule
end
end
更新
我也在使用recurrence_select gem。这就是让用户轻松选择“每周周一、周三和周五”的原因。我分别让用户为项目选择start_time
和end_time
。当我保存到数据库时,我正确地将时间从他们的时区转换为 UTC。我不知何故需要知道日子是否也会过去并在保存之前对其进行修改。