Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 查找下一个有效日期,给出日期和时间_Ruby On Rails_Ruby_Datetime - Fatal编程技术网

Ruby on rails 查找下一个有效日期,给出日期和时间

Ruby on rails 查找下一个有效日期,给出日期和时间,ruby-on-rails,ruby,datetime,Ruby On Rails,Ruby,Datetime,所以我想要一个方法,我可以通过它传递一个月中的一天和一个时间,它会找到下一个有效的日期时间。因此,如果那天是9月15日,而我正在寻找17日,它将返回9月17日。但是如果我在找31号,它会返回10月31号,因为9月31号不存在 我只是尝试创建一个方法,但它没有考虑无效日期: def find_next_date(day, time) now = Time.now if (day == now.day && time > now.strftime("%H%M%S%N"

所以我想要一个方法,我可以通过它传递一个月中的一天和一个时间,它会找到下一个有效的日期时间。因此,如果那天是9月15日,而我正在寻找17日,它将返回9月17日。但是如果我在找31号,它会返回10月31号,因为9月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

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

您可以试试这个。我没有处理
时间
部分,因为我不确定您发送的是哪一个参数(
字符串
时间
),但这应该会让您上路

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
类日期时间
定义self.find_next_date(日,时间=“00:00:00+00:00”)
如果天>31 | |天<1,则引发ArgumentError
当前日期=今天的日期
当当前_date.day!=白天
当前日期=当前日期。下一天
结束
parse(当前_date.strftime(“%Y-%m-%dT{time}”))
结束
结束
日期时间。查找下一个日期(31)
#=> #
日期时间。查找下一个日期(30)
#=> #
日期时间。查找下一个日期(1)
#=> #
日期时间。查找下一个日期(25)
#=> #
DateTime.查找下一个日期(22,“01:00:00+00:00”)
#=> #
日期时间。查找下一个日期(32)
#=>ArgumentError:ArgumentError

看起来它应该对你有用,虽然对
时间
的一些处理应该到位

Hmmm这会给我我想要的答案,但我有点不喜欢它基本上一直以蛮力的方式迭代。但这是我现在能想到的唯一可行的方法。我可能会在第二天用我自己的版本。谢谢!@Dragonfly我同意你的看法,但它似乎是最干净的解决方案,不会使事情过于复杂,最大迭代次数约为59次。不过,我确实考虑过通过日期(日期:现在1个月)来实现一个范围。但是,这个迭代将是相同的,更不那么简洁,并且会在二月引起好运。