您的位置:首页 > 其它

日历月份日期显示错误,修改

2015-07-11 14:39 197 查看
[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,1100,

从左到右依次对应1月到12月(一月29天,二月30天...);

问题描述为5月份天数为29天,想改成30天的话就请将第五位从0转为1即0101,1101,1011。但是仅做此修改的话,会将之后的所有

日期向后推迟一天,所以该月前后应该还有月份会多一天,该月份需要从30天改回29天。查看万年历会发现它的6月是29天,而我们

的是30天,所以再次修改6月的天数数据从0转为1即0101,1001,1100,最终1996的item数据为<item>0x059c0</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>0x059c0</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的方法做修改。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: