返回Ruby中日期范围内的字符串

时间:2013-06-12 19:18:51

标签: ruby date

我正在编写一个查看一组文件的脚本,检查它们是否在“@due”标记中有任何行,后跟日期范围,然后获取这些行并将它们打印到单独的文件。 (基本上,我有一组文本文件,其中包含截止日期的项目,我希望每天都能提供一份逾期,今天到期以及未来4天内到期的文件。)

现在,我正在用钝力做这件事:

tom1 = (Time.now + 86400).strftime('%Y-%m-%d')
tom2 = (Time.now + (86400 * 2)).strftime('%Y-%m-%d')
tom3 = (Time.now + (86400 * 3)).strftime('%Y-%m-%d')

等,然后:

if line =~ /@due\(#{tom1}\)/
found_completed = true
project += line.gsub(/@due\(.*?\)/,'').strip + " **1 day**" + "\n" + "\t"
end

if line =~ /@due\(#{tom2}\)/
found_completed = true
project += line.gsub(/@due\(.*?\)/,'').strip + " **2 days**" + "\n" + "\t"
end

等。等

我在过去,当天以及未来4天这样做了30天。我想知道,也许如果我需要“日期”而不是“时间”,然后设置某种范围,如果没有更优雅的方法来做到这一点。

谢谢!

2 个答案:

答案 0 :(得分:1)

我相信这会奏效,或轻轻按摩会奏效。我在几个日期测试了它,它对他们有效。运行脚本时,请确保通过命令行将日期作为YYYY-MM-DD传递。我写入控制台而不是另一个文件,这样我就可以更轻松地检查测试值。如果文件中的一行没有格式良好的日期值,我使用了begin-rescue块。

require 'date'

def due(due_dates)
    due_dates.each do |x|
        puts x
    end
end

today = Date.parse(ARGV.shift)

f = File.readlines('path_to_file')

due_today = []
due_within_four = []
past_due = []
f.each do |line|
    begin
        d = Date.parse(line)
        due_today << line if d == today
        due_within_four << line if (today+1..today+4).cover? d
        past_due << line if (today-30..today-1).cover? d
    rescue 
        next
    end
end

puts "DUE TODAY"
due(due_today)

puts "\nDUE WITHIN FOUR DAYS"
due(due_within_four)

puts "\nOVERDUE"
due(past_due)

答案 1 :(得分:0)

有些人可能认为这样的相对简单的情况有点过分,但我喜欢使用ice_cube(https://github.com/seejohnrun/ice_cube)gem来重现日期功能。这是一个如何接近它的例子,盐味。

require 'ice_cube'

lines = File.readlines('myfile.txt')
start_date = Time.now - 30 * 86400
end_date   = Time.now + 4 * 86400
matched_lines = IceCube::Schedule.new(start_date).tap do |schedule|
    schedule.add_recurrence_rule IceCube::Rule.daily
end.occurrences(end_date).collect do |time|
    formatted_time = time.strftime('%Y-%m-%d')
    lines.map { |line| line if line =~ /@due\(#{formatted_time}\)/ }
end.flatten