用于检查闰年的正确表达式

时间:2010-06-12 16:58:17

标签: calendar leap-year

  

可能重复:
  how to find leap year?

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

但是这个定义会让100,200,300,400 ......达到1700年,而不是LEAP年!但在格里高利历中,所有这些都是闰年,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

6 个答案:

答案 0 :(得分: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年在土耳其。

答案 1 :(得分:2)

我认为一方面将历史日期的想法与另一方面的日期计算分开是很重要的。历史日期受各种政治,社会和技术问题的影响,因此不太适合简单的算法。请参阅this page,了解采用现代格里高利历的广泛差异。

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

答案 2 :(得分:0)

看看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

答案 3 :(得分:0)

  

“但这是特定的公历”

请阅读此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 :(得分:0)

读下您链接的网页。 1752年9月出现差距的原因是,当英国从朱利安转换为格里高利历时,这不是格里高利历中的差距,而是两者之间的差异。

您链接到的页面使用Julian日历直到该点。因此,您用于计算闰年的算法与1752年之前的年份计算的页面(或英国,或英格兰,但在AD 100中不存在)的方式不同。

答案 5 :(得分:0)

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

因此,您的问题的答案将等同于:

if(exists(“02/29 / yyyy”.toDate))...