Ruby on rails 查找下一个有效日期,给出日期和时间
所以我想要一个方法,我可以通过它传递一个月中的一天和一个时间,它会找到下一个有效的日期时间。因此,如果那天是9月15日,而我正在寻找17日,它将返回9月17日。但是如果我在找31号,它会返回10月31号,因为9月31号不存在 我只是尝试创建一个方法,但它没有考虑无效日期: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"
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个月)来实现一个范围。但是,这个迭代将是相同的,更不那么简洁,并且会在二月引起好运。