0

可能重复:
如何找到闰年?

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

但是这个定义使得 100、200、300、400.... 到 1700 年不是闰年!但是在公历中,它们都是闰年,看看这个

您也可以尝试在 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);

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

问候,

PS:格里高利 callender 的历史似乎很有趣,看看1752 年 9 月

4

6 回答 6

2

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

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

于 2010-06-12T17:25:54.610 回答
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 年才在土耳其采用。

于 2010-06-12T17:01:45.870 回答
0

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

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

于 2010-06-12T17:16:46.100 回答
0

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

因此,您的问题的答案相当于:

如果(存在(“02/29/yyyy”.toDate)) ...

于 2010-06-12T18:52:43.060 回答
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

于 2010-06-12T17:08:13.407 回答
0

看看这里。我将在此处复制一些伪代码以供参考:

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
于 2010-06-12T17:01:14.247 回答