更新 我试图解决的问题需要的不仅仅是日期实现,因为它需要一种方法来考虑 1752 年后的格里高利历和 1752 年前的儒略历闰年的不同定义。
以下是我的解决方案,它通过了我所有的 RSpec,并且是对我开始使用的嵌套条件的相当大的改进:
def leap_year?(year)
gregorian_year = true if year >= 1752
julian_year = true if year < 1752
gregorian_test = true if year % 4 == 0 && year % 100 != 0 || year % 400 == 0
julian_test = true if year % 4 == 0
case
when gregorian_year && gregorian_test
true
when julian_year && julian_test
true
else
false
end
end
原始问题
我写了一个简单、丑陋的嵌套条件来实现以下目标:
实现以下目标:
如果年份满足以下条件则返回“true”:
- 能被四整除
- AND 不是世纪年(例如)1900
- 除非它能被 400 整除(例如 400、800、2000)
我写了一个丑陋的嵌套条件:
if year % 4 == 0
puts "Divisible by four"
if year % 100 == 0
puts "Century year"
if year % 400 == 0
puts "Quad-century year, leap year"
true
else
"Not a Quad-century year, not a leap year"
false
end
else
puts "Not a century year, leap year"
true
end
else
puts "Not divisible by four: not a leap year."
false
end
我试图用一个有条件的案例实现同样的目标,但它未能检测到数字 2016 作为闰年:
case year
when (year % 4 == 0 && year % 100 != 0)
true
when year % 400
true
when year % 4 != 0
false
end
两个问题:
- 我在有条件的情况下做错了什么?
- 有没有更好的方法来实现这一点?
最佳答案
如果您想确定给定年份是否为闰年,已经在 Date
类中为您实现了 Date#leap?
:
Date.leap?(2000)
#=> true
# Or, alternatively:
Date.gregorian_leap?(1900)
#=> false
Date.julian_leap?(1900)
#=> true
Ruby 文档中的更多信息:Date#leap?
如果您无论如何都想自己构建它,这应该可行:
def leap_year?(year)
return false unless year % 4 == 0
return true unless year % 100 == 0
year % 400 == 0
end
leap_year?(2016)
#=> true
关于ruby - 确定给定年份是否为闰年,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44985842/