【问题标题】:Easy way to determine leap year in ruby?确定红宝石闰年的简单方法?
【发布时间】:2010-12-06 16:46:52
【问题描述】:

有没有一种简单的方法可以确定一年是否是闰年?

【问题讨论】:

    标签: ruby datetime leap-year


    【解决方案1】:

    使用Date#leap?

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

    例如

    Date.leap?( 2018 ) # => false
    
    Date.leap?( 2016 ) # => true
    

    【讨论】:

    • 很好奇,为什么要使用变量flag?与闰年有关吗?
    【解决方案2】:

    为了您的理解:

    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
    

    【讨论】:

      【解决方案3】:

      试试这个:

      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
        

        【讨论】:

        • 注意我说它是给exercism.io的,它要求你自己实现逻辑作为编码练习。
        【解决方案5】:
        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)
        

        【讨论】:

          【解决方案6】:

          任何能被 4 整除的年份都是闰年。但是,仍然有一个小错误需要考虑。为了消除这个错误,公历规定能被 100 整除的年份(例如 1900 年)只有能被 400 整除的年份才是闰年。

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

          【讨论】:

          • 谢谢,@DebanjanB 我在顶部添加了一些解释 - 如何构建公式来计算闰年。你认为我应该如何添加一个更详细地解释公式的链接?类似的东西:support.microsoft.com/en-us/help/214019/…
          【解决方案7】:

          这个取一个范围:

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

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

          【讨论】:

            【解决方案8】:

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

            • 第一版/加长版
            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
            

            【讨论】:

              【解决方案9】:

              变量 n 需要年份来测试,如果是闰年则输出 true,如果不是则输出 false

              n=gets.to_i 
              n%4==0 ? n%100==0 ? n%400 ?(puts true):(puts false) :(puts true) :(puts false)
              

              【讨论】:

                【解决方案10】:

                已经有很多答案了,虽然这里有一个较短的版本:

                y%100 > 0 ? y%4 < 1 : y%400 < 1

                如果年份不是世纪,则检查是否为 4 的倍数,否则检查是否为 400 的倍数。

                【讨论】:

                  【解决方案11】:

                  这是我的方法:

                  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
                  

                  【讨论】:

                    猜你喜欢
                    • 2014-11-15
                    • 2011-05-24
                    • 2015-03-21
                    • 1970-01-01
                    • 2012-06-21
                    • 1970-01-01
                    • 2017-03-28
                    • 2011-01-31
                    • 1970-01-01
                    相关资源
                    最近更新 更多