所以我想要一个方法,我可以在一个月中的一天和一个时间传递它,它会找到下一个有效的DateTime。因此,如果那天是9月15日,我正在寻找17日,它将在9月17日返回。但是,如果我正在寻找第31个,它将在9月31日之后的10月31日返回。
我只是尝试创建一个方法,但它没有考虑无效日期:
def find_next_date(day, time)
now = Time.now
if (day == now.day && time > now.strftime("%H%M%S%N")) || day > now.day
DateTime.new(now.year, now.month, day, time)
else
if now.month + 1 > 12
year += 1
month = 1
else
year = now.year
month = now.month + 1
end
DateTime.new(year, month, day, time)
end
end
有没有更好的方法来做到这一点,它会考虑无效日期?
答案 0 :(得分:0)
你可以试试这个。我没有处理time
部分,因为我不确定你发送的是什么孩子的论点(String
或Time
)但是这应该让你顺利。
class DateTime
def self.find_next_date(day,time="00:00:00+00:00")
raise ArgumentError if day > 31 || day < 1
current_date = Date.today
while current_date.day != day
current_date = current_date.next_day
end
DateTime.parse(current_date.strftime("%Y-%m-%dT#{time}"))
end
end
DateTime.find_next_date(31)
#=> #<DateTime: 2014-07-31T00:00:00+00:00 ((2456870j,0s,0n),+0s,2299161j)>
DateTime.find_next_date(30)
#=> #<DateTime: 2014-07-30T00:00:00+00:00 ((2456869j,0s,0n),+0s,2299161j)>
DateTime.find_next_date(1)
#=> #<DateTime: 2014-08-01T00:00:00+00:00 ((2456871j,0s,0n),+0s,2299161j)>
DateTime.find_next_date(25)
#=> #<DateTime: 2014-07-25T00:00:00+00:00 ((2456864j,0s,0n),+0s,2299161j)>
DateTime.find_next_date(22,"01:00:00+00:00")
#=> #<DateTime: 2014-08-22T01:00:00+00:00 ((2456892j,0s,0n),+0s,2299161j)>
DateTime.find_next_date(32)
#=> ArgumentError: ArgumentError
虽然应该对time
进行一些处理