电子万年历怎么保证日期不出错的?

电子万年历怎么保证日期不出错的?

如果是直接引用紫金山天文台的1901~2100年农历的数据就是对的。

大多数万年历是采用查表法(天文计算也可以,但天文计算要存储的天文数据并不比直接历月数据少),直接用二进制表示各历月,因此只要源数据不错,自然就不会错。

只需要编制农历数据表(含闰月和月大小),即可计算每年的日期。

比如,3位表示闰月(8~11为1)、用13位表示月大小(29为1、30为0),则二零二零庚子年正月小 、二月大、三月大 、四月大、闰四月小、五月大 、六月小 、七月小 、八月大、九月小、十月大、冬月小、腊月大为0x8AD1 (100'0'1010'1101'0001)。

可用0xAD7(闰年)或0xAD3(平年)表示公历十二个月(30为0、31为1)。

公历日期−年偏差+月偏差即为农历日期

农历日期+年偏差−月偏差即为公历日期。

年偏差可通过历月数据累加,为了简便计算,亦可以直接附加年首日的星期、干支以及农历的年首日期。

一般的万年历app,1901~2100两百年就够用了,也就是200个无符号整数。实体电子万年历其实只需十九年的数据即可(基于寿命),单片机就可处理。

其他的就是数字转换成文字,并添加节气、节假日的注文。

节气可直接使用公历估算,选定某一年冬至的时间为基数,每过一年加349分钟(闰年)或减1091分钟(平年),每过百年再加30分钟,可估算出每年冬至的时间,然后逐节气叠加分钟数。

相对于15天的分钟数偏差数组可用[-410, -392, -341, -231, -99, 77, 253, 454, 628, 802, 921, 1021, 1050, 1046, 974, 870, 717, 544, 353, 163, -15, -171, -292, -374],计算结果不一定准确,但估计节气日期还是可以的。

农历的节假日主要分为按日期(春节端午之类)、按节气(清明)、按节气偏置(寒食数九春社秋社三伏和三戌腊日)等,日期节气都算出来了这些都很容易,按日期或节气的直接添加注文即可,偏置的则加算一个日期就好。

至于黄历中的二十八宿值日、建除十二神、五行用事、八卦用事、纳音五行、八字、宜忌、吉凶都是基于农历日期、节气,直接添上相关算式即可。