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

[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的方法做修改。
 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值