说明:注意是闰年平年的判断,不是闰月!闰年平年是公历中的历法规则,闰月是农历历法中的规则,两者之间是没有任何关联的,不管是闰年平年,都有可能会出现闰月。
要判断指定年份是闰年还是平年,有两种思路,不同思路,适用的语言不同,虽然标题中说的是 JavaScript ,但不同语言的编程思路很多都是相通的。
1. 根据年份规则来判断
闰年的计算规则:
- 普通闰年:公历年份是4的倍数,且不是100的倍数的,为闰年(如2004年、2020年等就是闰年)。
- 世纪闰年:公历年份是整百数的,必须是400的倍数才是闰年(如1900年不是闰年,2000年是闰年)。
知道了规则,计算起来就很简单了
var year = 2020; // 指定年份
var isLeap = year %400 == 0 || year %100 != 0 && year %4 == 0; // 根据年份判断是否为闰年
var day = isLeap ? 29 : 28; // 计算2月份的天数
var str = isLeap ? '闰年' : '平年';
console.log( year + '年2月的天数是' + day + '天,本年为' + str);
2. 根据Date()对象的参数规则来判断
给 Date()
对象传参时,是会自动纠错的,比如 new Date(2021,1,29)
, 参数的意思是将日期设置为 2021年2月29日
,但2021年是平年,2月份只有28天,所以最终的日期会被纠正为 2021年3月1日
。而如果将年份设置为2020年,即 new Date(2020,1,29)
,最终日期就是 2020年2月29日
,因为2020年是闰年,2月是有29日的。
知道了这个自动纠错的规则,就可以利用它来主动犯错,通过结果来反推年份是否为闰年。
var year = 2020; //要判断的年份
var date = new Date(y, 1, 29); // 参数的年份由y决定,后面两个则是固定值
var isLeap = date.getMonth() == 1; // true 为闰年,false 为平年
var day = isLeap ? 29 : 28; // 计算2月份的天数
var str = isLeap ? '闰年' : '平年';
console.log( year + '年2月的天数是' + day + '天,本年为' + str);
上面代码只适用于 JavaScript 中,但思路是相通的。
Ps: 1582年以前或年份很大(超过3200以上)的日期,计算规则都有所不同,但这个在目前的实际程序中应该不太会用上,所以就不作讨论啦。
网友评论