基本上我有一个应用程序,用户可以从现在到2年后的任何一天选择时间段。我正在创建一个rake任务,每天运行一次,从现在开始向我的数据库添加一条记录,所以明天仍然会有2年的时间段选择。
根据我目前的逻辑,我很好奇当闰年会发生什么,并且有没有办法让这个更加强大以正确处理闰年?我担心我要么最终得到一个完全错过的日子,要么结束一天的复制。
task :generate_timeslots => :environment do
startDate = Time.now.to_date + 2.years
endDate = Time.now.to_date + 2.years
startDate.upto(endDate).each do |d|
5.times do
timeslot = Timeslot.create
timeslot.location_id = 1
timeslot.timeslot = "#{d} 09:00:00"
timeslot.save
timeslot = Timeslot.create
timeslot.location_id = 1
timeslot.timeslot = "#{d} 11:00:00"
timeslot.save
timeslot = Timeslot.create
timeslot.location_id = 1
timeslot.timeslot = "#{d} 13:00:00"
timeslot.save
timeslot = Timeslot.create
timeslot.location_id = 1
timeslot.timeslot = "#{d} 15:00:00"
timeslot.save
end
end
end
答案 0 :(得分:3)
答案是 IF '两年后'包括越过闰年的第29天,然后在该备份中包含'额外'日以计入“额外”日2月29日在日历中。
答案 1 :(得分:0)
如果您的任务以幂等的方式运行,您不必担心意外创建太多插槽。
在调用Timeslot.create之前,通过选择和计算它们,改变您的脚本可能会产生重叠的天数,但不会产生足够的插槽。这样做的另一个好处是,在缺少运行的情况下(稍微)更强大,并且在脚本运行得太频繁的情况下更加强大。
我不知道您正在使用的ORM,因此您必须将其中一些视为伪代码:
task :generate_timeslots => :environment do
startDate = Time.now.to_date + 2.years - 2.days
endDate = Time.now.to_date + 2.years
startDate.upto(endDate).each do |d|
daily_slots = ["09:00:00","11:00:00","13:00:00","15:00:00"]
daily_slots.each do |daily_slot|
ts = "#{d} #{daily_slot}"
# I'm just guessing here (no ActiveRecord experience)
num_existing = Timeslot.where( :timeslot => ts ).count
next if num_existing >=5
(5-num_existing).times do
timeslot = Timeslot.create
timeslot.location_id = 1
timeslot.timeslot = ts
timeslot.save
end
end
end
答案 2 :(得分:0)
您可以将实际的闰日发送到未来4年,从而修复错误的另一面:我的闰日没有预先填充。
几十年来,这个解决方案是准确的(如果您没有任何时间填写表格的相关数据)。
答案 3 :(得分:0)
嗯,这是闰年if (!(year % 100) == 0 || (year % 400 == 0)) && (year % 4 == 0)
。
这根本不是rails语法,但我只是觉得我会把这个小问题插入到讨论中。
答案 4 :(得分:0)
这就是我想出的。我不是每天都会填充日期,而是设置我的cron在每个月的第一天运行,然后在那个月的每一天循环。这将包括闰年的第29个月。
startDate = (Time.now.beginning_of_month.to_date) + 2.years
endDate = ((Time.now.beginning_of_month.to_date) + 2.years).end_of_month
startDate.upto(endDate).each do |d|
5.times do
timeslot = Timeslot.create
timeslot.location_id = 1
timeslot.timeslot = "#{d} 09:00:00"
timeslot.save
timeslot = Timeslot.create
timeslot.location_id = 1
timeslot.timeslot = "#{d} 11:00:00"
timeslot.save
timeslot = Timeslot.create
timeslot.location_id = 1
timeslot.timeslot = "#{d} 13:00:00"
timeslot.save
timeslot = Timeslot.create
timeslot.location_id = 1
timeslot.timeslot = "#{d} 15:00:00"
timeslot.save
end
end