Calendar农历日期显示不正确
时间:10-02
整理:3721RD
点击:
[DESCRIPTION]
农历显示错误
[SOLUTION]
农历每月的天数信息存储在Calendar资源文件的 res/values/lunar_const_arrays.xml 的integer-array
lunar_info中;
每个item展开为2进制数,表示的意义如下:
二进制形式
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位。
17-20: 表示闰月是大月还是小月,仅当存在闰月的情况下有意义。
问题1:发现1996年7月15日农历显示为六月一日,自7月15日起到8月14日农历显示都错了。1996年的农历5月应该是
30天,实际是29天;1996年的农历6月应该是29天,实际是30天
问题1solution:
下面的solution以农历1996年5月份的为例,其他有数据不匹配的地方可以用相同的方法做修正:
该数组每10个item为一组,表示10年的lunar info,第一组的第一个item 为1900年,所以1996年的数据为第10组的第
7个item。
该item的中间3个16进制数字对应的二进制表示每月的天数(0--29天,1--30天);如0x055c0,中间的55c即为
0101,0101,1011,
从左到右依次对应1月到12月(一月29天,二月30天...);
问题描述为5月份天数为29天,想改成30天的话就请将第五位从0转为1即0101,1101,1011。但是仅做此修改的话,会
将之后的所有
日期向后推迟一天,所以该月前后应该还有月份会多一天,该月份需要从30天改回29天。查看万年历会发现它的6月是
29天,而我们
的是30天,所以再次修改6月的天数数据从0转为1即0101,1001,1011,最终1996的item数据为
<item>0x05ac0</item>。
code example 如下:
<integer-array name="lunar_info">
...
<item>0x04af5</item><!-- 10 -->
<item>0x04970</item>
<item>0x064b0</item>
<item>0x074a3</item>
<item>0x0ea50</item>
<item>0x06b58</item>
<item>0x05ac0</item><!-- M:1996 0x055c0-->
<item>0x0ab60</item>
<item>0x096d5</item>
<item>0x092e0</item>
问题2: 2033年没有闰七月,是闰十一月。
问题2solution:
2033年的数据为14组的第4个item 0x04bd7
展开为2进制形式为0000 0100 1011 1101 0111,由于有闰11月且闰11月为小月,所以只需将第1-4为改为1011,
对应的item即为<item>0x04bdb</item>, 若2033年的月份天数存在与万年历不对应的情况,请再遵照solution1的方法
做修改。
农历显示错误
[SOLUTION]
农历每月的天数信息存储在Calendar资源文件的 res/values/lunar_const_arrays.xml 的integer-array
lunar_info中;
每个item展开为2进制数,表示的意义如下:
二进制形式
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位。
17-20: 表示闰月是大月还是小月,仅当存在闰月的情况下有意义。
问题1:发现1996年7月15日农历显示为六月一日,自7月15日起到8月14日农历显示都错了。1996年的农历5月应该是
30天,实际是29天;1996年的农历6月应该是29天,实际是30天
问题1solution:
下面的solution以农历1996年5月份的为例,其他有数据不匹配的地方可以用相同的方法做修正:
该数组每10个item为一组,表示10年的lunar info,第一组的第一个item 为1900年,所以1996年的数据为第10组的第
7个item。
该item的中间3个16进制数字对应的二进制表示每月的天数(0--29天,1--30天);如0x055c0,中间的55c即为
0101,0101,1011,
从左到右依次对应1月到12月(一月29天,二月30天...);
问题描述为5月份天数为29天,想改成30天的话就请将第五位从0转为1即0101,1101,1011。但是仅做此修改的话,会
将之后的所有
日期向后推迟一天,所以该月前后应该还有月份会多一天,该月份需要从30天改回29天。查看万年历会发现它的6月是
29天,而我们
的是30天,所以再次修改6月的天数数据从0转为1即0101,1001,1011,最终1996的item数据为
<item>0x05ac0</item>。
code example 如下:
<integer-array name="lunar_info">
...
<item>0x04af5</item><!-- 10 -->
<item>0x04970</item>
<item>0x064b0</item>
<item>0x074a3</item>
<item>0x0ea50</item>
<item>0x06b58</item>
<item>0x05ac0</item><!-- M:1996 0x055c0-->
<item>0x0ab60</item>
<item>0x096d5</item>
<item>0x092e0</item>
问题2: 2033年没有闰七月,是闰十一月。
问题2solution:
2033年的数据为14组的第4个item 0x04bd7
展开为2进制形式为0000 0100 1011 1101 0111,由于有闰11月且闰11月为小月,所以只需将第1-4为改为1011,
对应的item即为<item>0x04bdb</item>, 若2033年的月份天数存在与万年历不对应的情况,请再遵照solution1的方法
做修改。