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.备忘录等涉及到时间的功能开发