查找给出日期和时间的下一个有效日期

时间:2014-07-25 19:25:18

标签: ruby-on-rails ruby datetime

所以我想要一个方法,我可以在一个月中的一天和一个时间传递它,它会找到下一个有效的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

有没有更好的方法来做到这一点,它会考虑无效日期?

1 个答案:

答案 0 :(得分:0)

你可以试试这个。我没有处理time部分,因为我不确定你发送的是什么孩子的论点(StringTime)但是这应该让你顺利。

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进行一些处理

,但它似乎应该对你有用