首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

java 兑现 阳历转阴历

2012-12-25 
java 实现 阳历转阴历阴历(lunar calendar)不像阳历(solarcalendar)那么有规律,只能按照天文观测中心发布

java 实现 阳历转阴历

阴历(lunar calendar)不像阳历(solarcalendar)那么有规律,只能按照天文观测中心发布的推测数据来推算。按照目前的推算只能推算到2050年。

在代码实现上也有很多方法,一般都是以一个世纪的开始第一个正月初一开始推算,例如有的是以1900年1月31日(庚子年正月初一),有的是以2000年2月5日(庚辰年正月初一),还有的是以任何一个已知的正月初一的日子开始推算。

大致的步骤是:

?按照阳历的日子,计算当日到已知的正月初一的总天数?然后按照已知推测规律,算出,当前阴历的年份、月份、日。?将得到年份分别模10,12;获得天干地支?然后再整理输出

先来看一下,先预先拿到的推测规律,都是以多位16进制来表示的。我见过两种规律。

?

第一种,由五位十六进制数字表示:

0xXXXXX

中间三位,转成十二位二进制,就是当年正常的12个月,从左到右依次表示一月到12月,0表示小月,即29天,1表示大月,即30天。最后一位表示当年的闰月,1表示闰一月,2表示闰2月……a表示闰10月,b表示闰11月,c表示闰12月第一位表示当年的闰月,是闰大月还是小月,1表示闰大月,即30天,0表示闰小月,即29天。

例如:1900年 0x04bd8

表示当年闰八月,闰小月,即29天。中间三位转换后为010010011011,表示二月、五月、八月、九月、十一月、十二月为大月(30天);其他未小月(29天)。

?

1月

2月

3月

4月

5月

6月

7月

8月

9月

10月

11月

12月

0

1

0

0

1

0

1

1

1

0

1

1

表示当年没有闰月,中间三位转换后为101110010110

1月

2月

3月

4月

5月

6月

7月

8月

9月

10月

11月

12月

1

0

1

1

1

0

0

1

0

1

1

0

?

1900到2050年的全部推算规律的第一种表示方法:

0x04bd8,?0x04ae0,?0x0a570,?0x054d5,?0x0d260,?0x0d950,?0x16554,?0x056a0,?0x09ad0,

0x055d2,?0x04ae0,?0x0a5b6,?0x0a4d0,?0x0d250,?0x1d255,?0x0b540,?0x0d6a0,?0x0ada2,

0x095b0,?0x14977,0x04970,?0x0a4b0,?0x0b4b5,?0x06a50,?0x06d40,?0x1ab54,?0x02b60,?

0x09570,0x052f2,?0x04970,?0x06566,?0x0d4a0,?0x0ea50,?0x06e95,?0x05ad0,?0x02b60,

0x186e3,0x092e0,?0x1c8d7,?0x0c950,0x0d4a0,?0x1d8a6,?0x0b550,?0x056a0,?0x1a5b4,

0x025d0,?0x092d0,?0x0d2b2,?0x0a950,?0x0b557,0x06ca0,?0x0b550,?0x15355,?0x04da0,

0x0a5d0,?0x14573,?0x052d0,?0x0a9a8,?0x0e950,?0x06aa0,?0x0aea6,?0x0ab50,?0x04b60,

0x0aae4,?0x0a570,?0x05260,?0x0f263,?0x0d950,?0x05b57,?0x056a0,0x096d0,?0x04dd5,

0x04ad0,?0x0a4d0,?0x0d4d4,?0x0d250,?0x0d558,?0x0b540,?0x0b5a0,?0x195a6,?0x095b0,

0x049b0,?0x0a974,?0x0a4b0,?0x0b27a,?0x06a50,?0x06d40,?0x0af46,?0x0ab60,?0x09570,

0x04af5,?0x04970,?0x064b0,?0x074a3,?0x0ea50,?0x06b58,?0x055c0,?0x0ab60,?0x096d5,

0x092e0,?0x0c960,?0x0d954,?0x0d4a0,?0x0da50,?0x07552,?0x056a0,?0x0abb7,?0x025d0,?

0x092d0,?0x0cab5,?0x0a950,?0x0b4a0,?0x0baa4,?0x0ad50,?0x055d9,?0x04ba0,?0x0a5b0,?

0x15176,?0x052b0,?0x0a930,?0x07954,?0x06aa0,?0x0ad50,?0x05b52,?0x04b60,?0x0a6e6,?

0x0a4e0,?0x0d260,?0x0ea65,?0x0d530,?0x05aa0,?0x076a3,?0x096d0,?0x04bd7,?0x04ad0,?

0x0a4d0,?0x1d0b6,?0x0d250,?0x0d520,?0x0dd45,?0x0b5a0,?0x056d0,?0x055b2,?0x049b0,?

0x0a577,?0x0a4b0,?0x0aa50,?0x1b255,?0x06d20,?0x0ada0

?

第二种,由三位或五位十六进制数字表示:

如果为三位数字,则表示当年只有12个月,无闰月,将其转换为十二位二进制,从左到右依次表示一月到十二月的大小月,1表示大月,即30天,0表示小月,即29天。如果为五位,则表有闰月,后四位,为转换为二进制,其前三位肯定都是0,后13为才有效。表示当年的十三个月的大小月,1表示大月(30天),0表示小月(29天)。其第一位十六进制数字表示,当年闰的哪个月份1表示闰一月,2表示闰2月……a表示闰10月,b表示闰11月,c表示闰12月

例如:1900年? 0x8096d

第一个十六进制为8,表示闰八月。

后四位六进制转成二进制为,0000100101101011。除去前三位,我们来看一下

?

1月

2月

3月

4月

5月

6月

7月

8月

闰8月

9月

10月

11月

12月

0

1

0

0

1

0

1

1

0

1

0

1

1

2000年? 0xc96

1月

2月

3月

4月

5月

6月

7月

8月

9月

10月

11月

12月

1

0

1

1

1

0

0

1

0

1

1

0

?

其结果与第一种完全一致

?

1900到2050年的全部推算规律的第二种表示方法:

0x8096d, 0x4ae, 0xa57, 0x50a4d,0xd26, 0xd95, 0x40d55, 0x56a,0x9ad, 0x2095d, 0x4ae, 0x6149b, 0xa4d, 0xd25, 0x51aa5, 0xb54, 0xd6a, 0x212da, 0x95b, 0x70937, 0x497, 0xa4b,0x5164b, 0x6a5, 0x6d4,0x415b5, 0x2b6, 0x957, 0x2092f,0x497, 0x60c96, 0xd4a, 0xea5, 0x50d69, 0x5ad, 0x2b6, 0x3126e,0x92e, 0x7192d, 0xc95, 0xd4a,0x61b4a, 0xb55, 0x56a, 0x4155b, 0x25d, 0x92d, 0x2192b, 0xa95,0x71695, 0x6ca, 0xb55, 0x50ab5, 0x4da, 0xa5d, 0x30a57, 0x52d, 0x8152a, 0xe95, 0x6aa, 0x615aa, 0xab5, 0x4b6, 0x414ae,0xa57, 0x526, 0x31d26, 0xd95, 0x70b55, 0x56a, 0x96d, 0x5095d, 0x4ad, 0xa4d, 0x41a4d, 0xd25, 0x81aa5, 0xb54, 0xb5a, 0x612da, 0x95b, 0x49b, 0x41497, 0xa4b,0xa164b, ?? 0x6a5, 0x6d4, 0x615b4, 0xab6, 0x957, 0x5092f, 0x497, 0x64b, 0x30d4a, 0xea5, 0x80d65, 0x55c, 0xab6, 0x5126d, 0x92e, 0xc96, 0x41a95, 0xd4a, 0xda5, 0x20b55, 0x56a, 0x7155b, 0x25d, 0x92d, 0x5192b, 0xa95,0xb4a, 0x416aa, 0xad5, 0x90ab5,0x4ba, 0xa5b, 0x60a57, 0x52b,0xa93, 0x40e95, 0x6aa, 0xad5, 0x209b5, 0x4b6, 0x614ae, 0xa4e, 0xd26, 0x51d26,0xd53, 0x5aa, 0x30d6a, 0x96d,0x7095d, 0x4ad, 0xa4d, 0x61a4b,0xd25, 0xd52, 0x51b54, 0xb5a,0x56d, 0x2095b, 0x49b, 0x71497, 0xa4b, 0xaa5, 0x516a5, 0x6d2, 0xada

?

下面是以第二种方式,实现的阳历阴历转换源码

    1 楼    iwlk    2012-09-18              是你写的吗?  强大~

如果有农历转阳历,就更好了~

热点排行