上一篇写了如何用JavaScript画出全年日历,javascript画全年日历_sdxjwkq01的博客-CSDN博客日历只显示了公历日期,没有农历。农历不是数学历法,是一种天文学历法,所以,想要计算农历,必须要有天文学观测的数据为支撑,再选取一个基准日期作为计算的起始点。
本篇文章所讲的农历算法,数据源自香港天文台提供的农历数据(包含1901-2100年200年的数据),是一些16进制数据块,下面先从他的数据结构讲起。
例如: 2023年 -- 0x05b52
这是16进制,转化为二进制为如下表所示
╭---------┰---------┰---------┰---------┰----------╮
┆ 0000 ┆ 0101 ┆ 1011 ┆ 0101 ┆ 0010 ┆
┠---------╊---------╊---------╊---------╊----------┨
┆ 20-17 ┆ 16-12 ┆ 12-9 ┆ 8-5 ┆ 4-1 ┆
╰---------┸---------┸---------┸---------┸----------╯
其中1-4位代表当年有无闰月,值为0表示本年无闰月,值非0则表示闰月的月份,2023年1-4位的值为0010,即十进制的2,所以2023年的润二月。
16-5连续12位为除了闰月外的正常月份是大月还是小月,值为1表示30天,值为0表示29天,2023年的16-5位依次是0101101101010010,则对应的1-12月天数为29,30,29,29,30,30,29,30,30,29,30,29,30
17-20: 表示闰月是大月还是小月,仅当存在闰月的情况下有意义,值为1表示30天,值为0表示29天。
有了数据结构,公历转农历就简单多了,下面直接上代码,都有注释,很简单,文中的源码&#