首先说明一下,数组中的每一个元素,都对应着一个年份。根据这个元素,可以计算出在该年份中,农历历法一共有多少天。
代码详情
lunarInfo: [
0x04bd8,
0x04ae0,
0x0a570,
0x054d5,
0x0d260,
0x0d950,
0x16554,
0x056a0,
0x09ad0,
0x055d2, // 1900-1909
0x04ae0,
0x0a5b6,
0x0a4d0,
0x0d250,
0x1d255,
0x0b540,
0x0d6a0,
0x0ada2,
0x095b0,
0x14977, // 1910-1919
0x04970,
0x0a4b0,
0x0b4b5,
0x06a50,
0x06d40,
0x1ab54,
0x02b60,
0x09570,
0x052f2,
0x04970, // 1920-1929
0x06566,
0x0d4a0,
0x0ea50,
0x06e95,
0x05ad0,
0x02b60,
0x186e3,
0x092e0,
0x1c8d7,
0x0c950, // 1930-1939
0x0d4a0,
0x1d8a6,
0x0b550,
0x056a0,
0x1a5b4,
0x025d0,
0x092d0,
0x0d2b2,
0x0a950,
0x0b557, // 1940-1949
0x06ca0,
0x0b550,
0x15355,
0x04da0,
0x0a5b0,
0x14573,
0x052b0,
0x0a9a8,
0x0e950,
0x06aa0, // 1950-1959
0x0aea6,
0x0ab50,
0x04b60,
0x0aae4,
0x0a570,
0x05260,
0x0f263,
0x0d950,
0x05b57,
0x056a0, // 1960-1969
0x096d0,
0x04dd5,
0x04ad0,
0x0a4d0,
0x0d4d4,
0x0d250,
0x0d558,
0x0b540,
0x0b6a0,
0x195a6, // 1970-1979
0x095b0,
0x049b0,
0x0a974,
0x0a4b0,
0x0b27a,
0x06a50,
0x06d40,
0x0af46,
0x0ab60,
0x09570, // 1980-1989
0x04af5,
0x04970,
0x064b0,
0x074a3,
0x0ea50,
0x06b58,
0x055c0,
0x0ab60,
0x096d5,
0x092e0, // 1990-1999
0x0c960,
0x0d954,
0x0d4a0,
0x0da50,
0x07552,
0x056a0,
0x0abb7,
0x025d0,
0x092d0,
0x0cab5, // 2000-2009
0x0a950,
0x0b4a0,
0x0baa4,
0x0ad50,
0x055d9,
0x04ba0,
0x0a5b0,
0x15176,
0x052b0,
0x0a930, // 2010-2019
0x07954,
0x06aa0,
0x0ad50,
0x05b52,
0x04b60,
0x0a6e6,
0x0a4e0,
0x0d260,
0x0ea65,
0x0d530, // 2020-2029
0x05aa0,
0x076a3,
0x096d0,
0x04afb,
0x04ad0,
0x0a4d0,
0x1d0b6,
0x0d250,
0x0d520,
0x0dd45, // 2030-2039
0x0b5a0,
0x056d0,
0x055b2,
0x049b0,
0x0a577,
0x0a4b0,
0x0aa50,
0x1b255,
0x06d20,
0x0ada0, // 2040-2049
0x14b63,
0x09370,
0x049f8,
0x04970,
0x064b0,
0x168a6,
0x0ea50,
0x06b20,
0x1a6c4,
0x0aae0, // 2050-2059
0x0a2e0,
0x0d2e3,
0x0c960,
0x0d557,
0x0d4a0,
0x0da50,
0x05d55,
0x056a0,
0x0a6d0,
0x055d4, // 2060-2069
0x052d0,
0x0a9b8,
0x0a950,
0x0b4a0,
0x0b6a6,
0x0ad50,
0x055a0,
0x0aba4,
0x0a5b0,
0x052b0, // 2070-2079
0x0b273,
0x06930,
0x07337,
0x06aa0,
0x0ad50,
0x14b55,
0x04b60,
0x0a570,
0x054e4,
0x0d160, // 2080-2089
0x0e968,
0x0d520,
0x0daa0,
0x16aa6,
0x056d0,
0x04ae0,
0x0a9d4,
0x0a2d0,
0x0d150,
0x0f252, // 2090-2099
0x0d520,
], // 2100
其实,这段代码并不难以理解,它的每一个元素都是一个 16 进制数。
我们将其转化为二进制可以发现:
xxxx | xxxx | xxxx | xxxx | xxxx | |
---|---|---|---|---|---|
位数 | 20-17 | 16-12 | 12-9 | 8-5 | 4-1 |
- 1-4 位: 表示当年有无闰年,有的话,为闰月的月份,没有的话,为0。
- 5-16 位:为除了闰月外的正常月份是大月还是小月,1为30天,0为29天。
- 注意:从 1 月到 12 月对应的是第 16 位到第 5 位(而不是从第 5 位 到第 16 位)。
- 17-20 位: 1 和 0 分别表示闰月是 大月 还是 小月,大月 30 天,小月 29 天(仅当存在闰月的情况下有意义)。
案例解读
- 1980年 => 0x095b0
- 二进制:
0000 1001 0101 1011 0000
- 1-4 位:
0000
=> 表示1980年没有闰月 - 16-5 位:
1001 0101 1011
=> 表示1980年从1月到12月的天数依次为:30、29、29、30、29、30、29、30、30、29、30、30。 - 20-17 位:
0000
=> 没有闰月,所以无所谓闰大小月,该段代码不考虑
- 二进制:
- 1982年 => 0x0a974
- 二进制:
0000 1010 1001 0111 0100
- 1-4 位:
0100
=> 表示1982年的4月为闰月,即有第二个4月。 - 16-5 位:
1001 0101 1011
=> 表示1982年从1月到13月的天数依次为:30、29、30、29、 29(闰四小月)、 30、29、29、30、 29、30、30、30。 - 20-17 位:
0000
=> 闰月,0 为闰小月,得出4月是闰小月
- 二进制: