日历月份日期显示错误,修改
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的方法做修改。
农历显示错误
[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的方法做修改。
相关文章推荐
- CodeIgniter学习笔记(十五)——CI中的Session
- Java多线程当中的violate
- C# 一个进程调用另外一个进程并传入参数
- MFC CView中添加CListCtrl控件的方法
- 机器学习技法总结(六)Decision Tree Hypothesis
- JS高级学习历程-15
- 关于C语言书籍推荐:深入学习c语
- OpenHCI - Data Transfer Types
- 【Ajax】脑补一下 ajax 的options
- Apache Common下的工具类介绍
- Log4j – 如何配置多个logger?
- Maven 生命周期
- [LeetCode] Valid Number
- 花生壳二级域名怎么用
- 初学python、Django
- swift错误: Type "xxx" does not confirm to protocol "BooleanType"
- ZH奶酪:编程语言入门经典100例【Python版】
- linux /proc/stat 文件说明
- String s=new String("abc")创建了几个对象?
- UI4_注册登录界面