首页 > 编程知识 正文

闰年计算方法编程,闰年的计算方式怎么算

时间:2023-05-03 18:12:40 阅读:212516 作者:2095

由于这个问题找的人还是非常多,所以今天我把它从我原来的blog上转过来,希望对大家有所帮助。

这篇文章是我去年的时候写的,那时候还没用PHP,所以闰年的计算方法没有PHP的,今天在这里补充上这段代码,$y代表年份:

第一种算法:

if

(

$y

%

400

==

0

||

(

$y

%

4

==

0

&&

$y

%

100

!=

0

)){

echo

"

"

;

}

else

{

echo

"

不是

"

;

}

第二种算法:

if

(

$y

%

4

==

0

&&

(

$y

%

400

==

0

||

$y

%

100

!=

0

)){

echo

"

"

;

}

else

{

echo

"

不是

"

;

}

重看自己写的文章,发现自己总结的两条判断条件有点模糊,可能不看程序还真看不出来,那我就再总结一下。

判断某一年是不是闰年的条件是:能被4整除且不可以被100整除,或者能被400整除。

以下是原来的文章

闰年的计算方法,一个严重的问题!

yoyo 发表于 2006-2-13 11:22:27今天在看JAVA的一个计算闰年的程序的时候,看到下面的一句话:判断闰年的条件是“能被4整除且不能被100整除,或者能被100 整除,同时也能被400整除”。看到这个判断的方法后我懵了,主要原因是它和我记忆中的判断方法完全不一样,我记忆中的方法是“能被4整除即可”,这是我 小学时候学的,而且我已经确认,我们那个时候一起上学的都是这么被教的,更让我感到惊讶的是很多其他地方的人也这么认为,可以看出这是一个普遍现象,我感 觉可能是教科书错了或者是教科书上没有讲计算方法。如果是教科书上也这么说的话,那可是个大问题了。对于现在的很多人并没有意识到自己的计算方法是错误 的,因为2000年恰好是闰年,并且如果不是刻意的去准确的算哪一年是不是闰年并且和准确的万年历做对比也很难碰到算错的情况。因为这些特殊的年份比较 少,你可以看1900年和2100年就不是闰年。这是一个说小就小,说大就大的问题,不经常和日期时间打交道的人就认为也无所谓,毕竟有生之年也碰不到这 个错误了(2100不是闰年)。但是经常和时间打交道的人就会碰到这个问题了,而且可能会出现大错误。而且对于我这种经常写程序的人也是要碰到这个问题 的。对于这个简单的问题,到现在才纠正,我感到很遗憾……最后总结一下计算的条件:

1.能被4整除且不可以被100整除;

2.能被400整除。

满足任何一个条件都可以。

[经过我在各大论坛问帖子调查,发现有一大部分人是把“能被4整除”当作判断条件的,此调查说明这个问题的普遍性]今天在CSDN上关于这个问题的讨论小有收获,有人给出的算法是0==y%4 && (0!=y%100 || 0==y%400),我不知道这个表达式对不对,但是我知道他的逻辑是对的。

现在我用VBScript写出两种算法的程序:

第一种算法:

if y mod 400 = 0 or (y mod 4=0 and y mod 100<>0) then

msgbox "是"

else

msgbox "不是"

end if

第二种算法:

if y mod 4 = 0 and (y mod 400 = 0 or y mod 100 <> 0) then

msgbox "是"

else

msgbox "不是"

end if

感觉第二种算法更锻炼算法。

——————————————————————————–

最近在学习JAVA,忽然又看到了这个问题,这里补充上JAVA的代码:

import

java

.

io

.*;

public

class

AppCharInOut

{

public

static

void

main

(

String

[]

args

)

{

String

s

=

""

;

int

n

=

0

;

try

{

BufferedReader

in

=

new

BufferedReader

(

new

InputStreamReader

(

System

.

in

))

;

System

.

out

.

print

(

"

请输入一个年份:

"

)

;

s

=

in

.

readLine

()

;

n

=

Integer

.

parseInt

(

s

)

;

}

catch

(

IOException

e

){}

if

((

n

%

4

==

0

&&

n

%

100

!=

0

)

||

(

n

%

400

==

0

))

//判断闰年的条件

{

System

.

out

.

println

(

s

+

"

年是闰年

"

)

;

}

else

{

System

.

out

.

println

(

s

+

"

年不是闰年

"

)

;

}

}

}

以下是原文章的评论内容

Re:闰年的计算方法,一个严重的问题!

yoyo发表评论于2006-7-1 20:48:51以下引用aaa(游客)在2006-6-18 10:39:22发表的评论:今年是2006年,闰7月,是闰年吗?但是2006不能被4或400整除,为什么?这里说的闰年指的是公历闰年,即二月是不 是29天或者说一年是不是366天,而不是说的农历的闰年。Re:闰年的计算方法,一个严重的问题!

aaa(游客)发表评论于2006-6-18 10:39:22今年是2006年,闰7月,是闰年吗?但是2006不能被4或400整除,为什么?Re:闰年的计算方法,一个严重的问题!

梅子(游客)发表评论于2006-6-17 20:29:45

我终于从这儿学到了公历与农历对应的时间。那就是19年为一周期。谢谢。

Re:闰年的计算方法,一个严重的问题!

yoyo(游客)发表评论于2006-2-14 10:39:01

借用从blueidea上的回复供浏览的朋友参考:

在公历(格里历)纪年中,有闰日的年份叫闰年,一般年份365天,闰年为366天。由于地球绕太阳运行周期为365天5小时48分46秒(合 365.24219天)即一回归年,公历把一年定为365天。所余下的时间约为四年累计一天,加在二月里,所以平常年份每年365天,二月为28天,闰年 为366天,二月为29天。因此,每400年中有97个闰年,闰年在2月末增加一天,闰年366天。闰年的计算方法:公元纪年的年数可以被四整除,即为闰 年;被100整除而不能被400整除为平年;被100整除也可被400整除的为闰年。如2000年是闰年,而1900年不是。

下面是一个计算公历闰年的例子:

s = InputBox(”请输入年份:”)

n = Val(s)

If n Mod 400 = 0 Or (n Mod 4 = 0 And n Mod 100 <> 0) Then

MsgBox s + “是闰年!”

End If

中国旧历农历纪年中,有闰月的一年称为闰年。一般年份为12个月,354或355天,闰年则为13个月,383或384天。农历作为阴阳历的一种, 每月的天数依照月亏而定,一年的时间以12个月为基准;为了合上地球围绕太阳运行周期即回归年,每隔2到4年,增加一个月,增加的这个月为闰月,因此农历 的闰年为 13个月。

农历没有第十三月的称谓,闰月按照历法规则,排放在从二月到十月的过后重复同一个月,重复的这个月为闰月,如四月过后的闰月称为闰四月。

农历闰年闰月的推算,3年一闰,5年二闰,19年七闰;农历基本上19年为一周期对应于公历同一时间。如公历的2001年5月27日、1982年5月27日和1963年5月27日这个日子,都是闰四月初五。

公历1982年至2042年与农历闰年闰月对照表

公历所在月份 闰月(初一日) 干支年

1982年5月23日 闰四月小 壬戊年

1984年11月23日 闰十月大 甲子年

1987年7月26日 闰六月大 丁卯年

1990年6月23日 闰五月大 庚午年

1993年4月22日 闰三月大 癸酉年

1995年9月25日 闰八月大 乙亥年

1998年6月24日 闰五月小 戊寅年

2001年5月23日 闰四月大 辛巳年

2004年3月21日 闰二月大 甲申年

2006年8月24日 闰七月大 丙戊年

2009年6月23日 闰五月大 己丑年

2012年5月21日 闰四月小 壬辰年

2014年10月24日 闰九月小 甲午年

2017年7月23日 闰六月大 丁酉年

2020年5月23日 闰四月小 庚子年

2023年3月22日 闰二月大 癸卯年

2025年7月25日 闰六月大 己巳年

2028年6月23日 闰五月大 戊申年

2031年4月22日 闰三月大 辛亥年

2033年8月25日 闰七月大 癸丑年

2036年7月23日 闰六月小 丙辰年

2039年6月22日 闰五月大 己未年

2042年3月22日 闰二月大 壬戊年

//2008-12-03 dahuilangc

//根据上面的文章自己实现了个c++的

BOOL LeapYear(int nYear)

{

return (nYear % 4 == 0) ^ (nYear % 400 == 0) ^ (nYear % 100 == 0);

}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。