当前位置:首页 »“秋了秋”个人博客 » 前端编程 » 2月份的历史以及天数的计算法则

2月份的历史以及天数的计算法则

作者:秋了秋 发表时间:2021年10月15日

背景:


平年和闰年的由来?


公历的一年,是记录地球环绕太阳公转一周的时间。比如2021年,表示人类从计时开始地球已经绕太阳公转了2021圈。 经过测算,地球公转一周需365.2422天,即365天5小时48分46秒。为了计算方便,公历就把一年定为365天,这一年叫做平年。照这样计算,每年就要少计算5小时48分46秒,4年共少计算23小时15分4秒,接近一天的时间。因此,公历规定,每4年就把少计算的一天补加在第四年的2月份里,这一年就叫做闰年。


每四年出现一个闰年,时间差不是整整24小时,而是23小时15分4秒,所以四年一闰又少算了44分56秒,看来误差很小,但时间长了,误差就大了。每400年就要少算3日2时53分20秒,所以每400年应增加3天。为了便于计算,就做了“四年一闰,百年不闰,四百年又闰”的规定。所以科学家又做一项补充规定:年份是整百年的必须是400的倍数才是闰年。


由此得出的计算规则是:


普通闰年:公历年份是4的倍数,且不是100的倍数的,为闰年(如2004年、2020年等就是闰年)。
世纪闰年:公历年份是整百数的,必须是400的倍数才是闰年(如1900年不是闰年,2000年是闰年)。


为什么2月份是28天或29天?


公历的前身是罗马皇帝儒略˙恺撒创立的。原先规定每年12个月,单月31天,双月30天,6个大月,6个小月,即6 x 30 + 6 x 31 = 全年共366天,2月是双月所以2月份是30天。


因为平年只有365天,因此平年需要去掉一天,但是在哪一个月里去掉呢?当时,古罗马判处犯人死刑都是在每年的2月份执行的,为了使这个不吉利的月份快快过去,恺撒就决定在2月份去掉一天。即2月份变成了平年29天,闰年是30天。



2月份是怎么从29天或者30天变成现在的28天或者29天的?


后来,恺撒的儿子奥吉斯都做了皇帝。他发现恺撒出身在7月,是大月,而自己出身在8月,却是小月,他就感觉到有失自己的尊严,于是他又下令再从2月份里抽出一天补在8月份里。使8月份变成了大月。从此,2月份又少了一天,即在平年为28天,在闰年为29天。


为什么月份不遵循一个月大一月小的规则呢?


因为8月由小月改为大月,打破了一大一小的规律,为了维持一年总天数不变,8月后面的月份颠倒过来,改为单月为小月,双月为大月,即一小一大。这样一来,一年中大月是1,3,5,7,8,10,12月,小月是4,6,9,11月。这种规律比较拙的规律一直沿用到现在,成为世界通用的公历历法


规律虽然比较乱,但还是有规律可循,即可以通过程序自动计算出任何年份任何月份的天数


javascript的计算方法如下:



获取结果: 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31


function getMonthDays(year, month) {
	if(isNaN(year) || isNaN(month)) {
		throw new Error('参数必须为数字');
	}
	month = +month;
	year = +year;
	if(month < 1 || month > 12) {
		throw new Error('月份参数必须1~12');
	}
	let daysCount;
	if(month === 2) {
		let base = year % 100 === 0 ? 400 : 4;
		daysCount = year % base === 0 ? 29 : 28;
	} else if(month < 8) {
		daysCount = month % 2 === 0 ? 30 : 31;
	} else {
		daysCount = month % 2 === 0 ? 31 : 30;
	}
	let days = [];
	for(let i = 1; i <= daysCount; i++) {
		days.push(i);
	}
	return days;
}

使用场景:1.电子日历插件(时间选择器的核心代码)。2.备忘录等涉及到时间的功能开发

8
文章作者: “秋了秋”个人博客,本站鼓励原创。
转载请注明本文地址:http://netblog.cn/blog/67.html
目录: 前端编程标签: 2月天数,闰年平年,月份天数 6051次阅读

请求播放音乐,请点击播放

登 录
点击获取验证码
还没账号?点击这里