Rails cron作业每天运行2年后创建数据库记录。如何解释闰年?

时间:2013-03-25 03:28:28

标签: ruby-on-rails ruby date cron rake

基本上我有一个应用程序,用户可以从现在到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

5 个答案:

答案 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