Ruby:日期选择程序(从列表中选择下一个可用日期)

时间:2011-09-30 16:29:42

标签: ruby date

我正在尝试构建帮助程序以从列表中选择下一个可用日期。

我有一个天数列表作为参考(那些是我想要发生事情的日子)

class_list = ["Monday","Saturday","Sunday"]

我需要查看当天并在列表中进行匹配。 如果它是列表的一部分,我选择它,如果不是,我从列表中选择下一个。

这是我到目前为止所做的:

#select current day, get its name value and weekday number value
today = Time.now
today_name = today.strftime("%A")
#not sure which of the 2 following line is better
#today_index = DateTime.parse(today_name).wday 
today_index = today.strftime("%u").to_i

然后我做匹配

if class_list.include? today_name
  #victory!!!
  puts today_name
else
  puts "find next day"
  class_list.each do |x|
    if DateTime.parse(x).wday > today_index
      puts "result #{x}"
      break
    end
  end
end 

当我运行它似乎工作正常,但因为我只是学习Ruby我总是想知道我是不是过于复杂的事情。

这段代码对你们Ruby主人来说是否合适?

3 个答案:

答案 0 :(得分:1)

我最好有一个地图将某一天与下一天联系起来,如果找不到这一天,我会有一个默认值:

days = {:Monday => :Tuesday, :Tuesday => :Wednesday ...}
days.default = :Monday

当你做几天[:星期一]时,你得到:星期二 当您尝试获取不存在的条目时,您将获得默认值。

答案 1 :(得分:1)

对于这部分:

if class_list.include? today_name
  #victory!!!
  puts today_name
else
  puts "find next day"
  class_list.each do |x|
    if DateTime.parse(x).wday > today_index
      puts "result #{x}"
      break
    end
  end
end 

你可以这样写:

if class_list.include? today_name
  #victory!!!
  puts today_name
else
  puts "find next day"
  result = class_list.find {|e| DateTime.parse(e).wday > today_index }
  puts "result = #{result}"
end 

答案 2 :(得分:1)

require 'date'

def next_date_from(ar)
  cur_day = Date.today
  cur_day += 1 until ar.include?(cur_day.strftime('%A'))
  cur_day
end

puts next_date_from(%w(Monday Saturday Sunday))
#=>2011-10-01