日历的公历转农历

日历的公历转农历

农历不像公历一样有规律可循,通过程序就可以直接计算出来,农历的计算方法一般是通过查表法(类似于查字典的方式)获取。

公历转农历:

日历的公历转农历_第1张图片

如上图所示,可以看出公历转农历的基本思路如下:

1、确定公历基准和农历基准

上图中选用公历1949年的1月29日与农历1949年的1月1日分别作为公历、农历的计算基准(下面为方便,分别称它们为公历基准和农历基准),它们对应同一天。确定公历基准和农历基准很灵活,它可以是日历上的任一一天,但是公历基准与农历基准必须对应同一天。确定公历基准的作用是为了计算与输入公历日期的相差天数,确定农历基准的作用是根据相差天数来计算输出对应的农历日期。

2、计算输入公历日期与公历基准之间的相差天数

在公历转农历的过程中,有一个不变的核心是,输入的公历日期与公历基准之间的相差天数等于输出的农历日期与农历基准之间的相差天数,用公式如下:

( 输 入 的 公 历 日 期 − 公 历 基 准 + 1 ) = ( 输 出 的 农 历 日 期 − 农 历 基 准 + 1 ) = 相 差 天 数 (输入的公历日期 - 公历基准 + 1) = (输出的农历日期 - 农历基准 + 1) = 相差天数 +1=+1=

当输入一个公历日期,首先计算输入的公历日期与公历基准之间相差天数,计算出的相差天数是固定的

3、计算输出的农历日期

输出的农历日期需要根据已计算的相差天数与农历基准来确定。

3.1、计算输出的农历日期的年份

由于农历每一年的天数是不固定的,所以利用计算出的相差天数依次减去从农历基准开始后的每一年的农历天数(包括农历基准年的天数),相差天数会不断减小,当相差天数减到小于0的时候,此时对应的农历年就是需要输出的农历年份;

3.2、计算输出农历日期的月份

当确定输出的农历年份之后,首先需要确定当年是否有闰月,有的话是闰几月,然后确定出该农历年每个月的天数,接着利用相差天数在减去上一农历年总天数后剩下的天数来确定月份,依次减去农历每个月的天数,当相差天数小于0的时候,此时对应的月份就是需要输出的农历月份。

3.3、计算输出农历日期的天

最后,相差天数在减去已确定月份上一月的天数之后剩下的天数就是最终要输出的农历日期的天。

这样就完成了公历转农历的计算。

举个例子

思路就是上面一大段,图文并茂,图比较简单,文字可能比较绕,不如来个例子实在点:

以输入公历1950年10月1日为例(公历基准和农历基准为公历1949年的1月29日和农历1949年的1月1日):

1、计算出与公历基准的相差天数为611天;

2、农历1949年和1950年的总天数分别为384天、354天;

3、相差天数610减去农历1949年天数384后剩余227天,继续减去农历1950年的总天数354时,相差天数小于0,此时输出的农历年份应该为农历1950年;

4、农历1950年无闰月,因此有12个月,1-12月对应的天数分别为29、30、30、29、30、30、29、29、30、29、30、29。相差天数在减去农历1949年后剩余227天,将这226天依次减去农历1950年的每个月,直到相差天数小于0

月份 1 2 3 4 5 6 7 8 9 10 11 12
减去每月天数后剩余的相差天数 198 168 138 109 79 49 20 -9 - - - -

相差天数在减到8月份的时候小于0,此时输出的农历月份为8月,由于在减去7月份后剩余20天,所以输出的农历天数为20,最后输出的农历时期为农历1950年8月20日。结果没毛病 _

参考文献:

[1] 1900年至2100年公历、农历互转Js代码

你可能感兴趣的:(算法,javascript)