我正在编写一个脚本,该脚本查看一组文件,检查它们是否在“@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
等等。等等
我在过去 30 天、今天和 future 4 天都这样做。我在想,如果没有更优雅的方法来做到这一点,也许我需要“日期”而不是“时间”,然后设置某种范围。
谢谢!
最佳答案
我相信这会奏效,或者轻度按摩会奏效。我在极少数日期对其进行了测试,并且对他们有效。运行脚本时,确保通过命令行将日期作为 YYYY-MM-DD 传递。我写到控制台而不是另一个文件只是为了我可以更容易地检查测试值。如果您的文件中的一行没有格式正确的日期值,我会使用 begin-rescue block 。
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)
关于ruby - 在 Ruby 中返回日期范围内的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17073515/