用Ruby确定闰年的简单方法?

30

有没有简单的方法确定一个年份是否是闰年?

11个回答

67

使用Date#leap?函数。

now = DateTime.now 
flag = Date.leap?( now.year ) 

例如

Date.leap?( 2018 ) # => false

Date.leap?( 2016 ) # => true

好奇,为什么要使用变量 flag?这与闰年有关吗? - Joshua Pinter

10

为了您的理解:

def leap_year?(year)
  if year % 4 == 0
    if year % 100 == 0
      if yearVar % 400 == 0
        return true
      end
      return false
    end
    return true
  end
  false
end

这可以写成:

def leap_year?(year)
  (year % 4 == 0) && !(year % 100 == 0) || (year % 400 == 0)
end

9

试试这个:

is_leap_year = year % 4 == 0 && year % 100 != 0 || year % 400 == 0

4
这是我为exercism.io问题所写的答案,它提出了同样的问题。在练习中,你明确被告知忽略任何可能作为标准库函数实现的内容。
class Year
  attr_reader :year

  def initialize(year)
    @year = year
  end

  def leap?
    if @year.modulo(4).zero?
      return true unless @year.modulo(100).zero? and not @year.modulo(400).zero?
    end

    false
  end
end

请注意,这是为 http://exercism.io 设计的编程练习,要求您自己实现逻辑。 - MattC

2
def leap_year?(num)
 if num%4 == 0 && num%100 != 0  
    true
 elsif num%400 == 0 
    true
 elsif num%4 == 0 && num%100 == 0 && num%400 != 0 
    false
  elsif num%4 != 0 
    false
  end
end 
puts leap_year?(2000)

1
任何能被4整除的年份都是闰年。但是,仍存在一个小错误需要考虑。为了消除这个错误,公历规定,如果一个能被100整除的年份(例如1900年)也能被400整除,则它才是闰年。
class Date

  def self.leap?(year)
    year % 4 == 0 && year % 100 != 0 || year % 400 == 0
  end

end

1
谢谢,@DebanjanB。我在顶部添加了一些说明-如何构建计算闰年的公式。你认为我还应该添加一个链接来更详细地解释这个公式吗?类似于这样的东西:https://support.microsoft.com/en-us/help/214019/method-to-determine-whether-a-year-is-a-leap-year - Artem Sychov

0
变量n用于测试年份,如果是闰年则打印true,否则打印false
n=gets.to_i 
n%4==0 ? n%100==0 ? n%400 ?(puts true):(puts false) :(puts true) :(puts false)

0

使用尽可能少的比较,您可以这样做:

  • 首选/长版本
def leap_year?(year)
  # check first if year is divisible by 400
  return true if year % 400 == 0
  year % 4 == 0 && year % 100 != 0
end
  • 简短版本

我们可以使用短路 OR (||) 进行相同的检查:

def leap_year?(year)
  year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)
end

0

这是我的方法:

def leap_year?(year)
  Time.new(year, 12, 31).yday == 366
end

leap_year?(1999)
#=>  false

leap_year?(2000)
#=>  true

leap_year?(2100)
#=>  false

leap_year?(2104)
#=>  true

0

这个函数接受一个范围参数:

(starting..ending).each do |year|
  next if year % 4   != 0
  next if year % 100 == 0 && year % 400 != 0
  puts year
end

来源:《学习编程》Chris Pine著


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接