【问题标题】:Correct expression for checking leap years [duplicate]检查闰年的正确表达式[重复]
【发布时间】:2012-07-22 07:52:29
【问题描述】:

可能重复:
how to find leap year?

闰年的确切定义是什么? AFAIK“能被 4 整除的年份是闰年。但是对于世纪年,能被 400 整除的年份是闰年。

但该定义使 100、200、300、400.... 达到 1700 年不是闰年!但是在公历里都是闰年,check this out

你也可以尝试在Linux中“拨打1700”来验证。

所以闰年的正确算法是:

if ( (year % 4 == 0) && ( year <= 1700 || year % 100 != 0 || year % 400 == 0 ))
    printf("%d is a leap year.\n", year);
 else
    printf("%d is not a leap year.\n", year);

但这是公历特有的吗?即使是这样,为什么没有提到here

问候,

PS:Gregorian callender 的历史似乎很有趣,请查看September month of 1752

【问题讨论】:

    标签: calendar leap-year


    【解决方案1】:

    我认为将历史日期的概念与日期计算的概念分开是很重要的。历史日期会受到各种政治、社会和技术问题的影响,因此不太适合简单的算法。请参阅this page,了解在采用现代公历方面的巨大差异。

    计算日期时通常的做法是忘记历史,只是假装现有系统一直存在并且将永远存在。 (除非您是天文学家或某些其他类型的科学家,在这种情况下,您会使用更准确的东西,并且对历史日期更不感兴趣。)如果您的应用程序都是关于记录历史日期的,那么您将无论如何,需要一种方法将这些日期(取决于国家、历史时期等)映射到对计算更友好的通用日期系统。

    【讨论】:

      【解决方案2】:

      一方面,你的算法有点不对劲。更像是:

      if ( (year % 4 == 0) && ( year % 100 != 0 || year % 400 == 0 ))
          printf("%d is a leap year.\n", year);
       else
          printf("%d is not a leap year.\n", year);
      

      此外,公历直到 1582 年左右才被采用。

      编辑:

      公历于 1582 年颁布,但在不同时期被各国采用,直到 1926 年在土耳其。

      【讨论】:

      • 不同时期不同地方采用。例如,俄罗斯直到 20 世纪才采用。
      • 它于 1752 年 9 月在英国被采用,因此是当年“有趣”的月份,因为当时显示的日历是儒略历而不是公历。
      • 这很好。我认为 1582 年可能是它提出的年份。
      【解决方案3】:

      “但是这是公历特有的”

      是的。

      请阅读此http://en.wikipedia.org/wiki/Leap_year

      由于地球(和月球)的轨道,我们有各种各样的日历,每个日历都有复杂的规则,试图在日和年之间进行合理匹配。

      请阅读http://en.wikipedia.org/wiki/Gregorian_calendar

      请购买一份http://emr.cs.uiuc.edu/home/reingold/calendar-book/index.shtml

      【讨论】:

        【解决方案4】:

        阅读您链接到的网页。 1752年9月出现差距的原因是,英国从儒略历转换为公历时,不是公历的差距,而是两者之间的差异。

        您链接到的页面在此之前使用儒略历。因此,您用于计算闰年的算法与页面(或英国或英格兰,尽管在公元 100 年都不存在)计算 1752 年之前的年份的方式不同。

        【讨论】:

          【解决方案5】:

          看看here。我这里复制一些伪代码供参考:

          if (year modulo 4 is 0) and ((year modulo 100 is not 0) or (year modulo 400 is 0))
                 then is_leap_year
          else
                 not_leap_year
          

          【讨论】:

          • 在你的和/或周围加上括号。就目前而言,你的陈述是模棱两可的。 (gcc 会对类似的 C 代码发出警告)我如何解释这取决于我的操作顺序,这对于伪代码来说是非常不确定的。
          • 感谢输入,我只是从文章中复制代码,没有注意到问题
          【解决方案6】:

          如果您的平台具有 Date 数据类型,您的第一次尝试是使用它具有的任何日期表达式和操作功能。通常这些就足够了,您可以省去负责支持 YA 日期处理库的麻烦。

          所以你的问题的答案相当于:

          if(exists("02/29/yyyy".toDate)) ...

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-01-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-04-27
            • 2012-12-12
            • 1970-01-01
            相关资源
            最近更新 更多