当前位置:编程学习 > VB >>

1900-2100公历年以查表方式取农历二十四节气(VBA)


前提:
    农历二十节气,以地球绕太阳公转轨迹,以15度均匀分割,在1900~2100这个时间段,有以下规律:
    1.每公历月份,都有两个节气,分别在月首及月尾
    2.每个节气在月内与基准日期相差的天数为0-3天
    3.在1900~2100这201年,节气的分布种类共有69种

以上是由数据总结出来的,可以由此生成编程所需的数据,如下:(注:本数据由来源地址的代码中转换而来)
' 二十四节气在各月的基准日期 
solarTermBase = Array(4, 19, 3, 18, 4, 19, 4, 19, 4, 20, 4, 20, 6, 22, 6, 22, 6, 22, 7, 22, 6, 21, 6, 21) 
 
' 二十四节气以年为单位,在1900-2100年间,共有69种分布种类,一个长整型存储12个节气与基准日的天数差额,共2*69项(每2bit表示一个节气的天数差,0-3天,高8位置0) 
solarTermOS = Array( _ 
    &H95A59A, &H599AA5, &HA5A6AA, &H9AAAA9, &HA9AAAE, &HAAAAAA, &HAAFAEE, &HAEEAAA, &HEAA59A, &H599AA5, &HA9AAAA, &HAAAAAA, &HEAA59A, &H599A95, &H95A6AA, &H9A9AA9, _ 
    &HA5A6AA, &HAAAAAA, &HAABAAE, &HAAEAAA, &HAAA59A, &H599695, &H95A69A, &H9A9AA9, &HA5A6AA, &HAAAAA9, &H95A59A, &H9A9AA5, &HA9AAAE, &HAAEAAA, &HAAA59A, &H599555, _ 
    &HAAA599, &H599555, &HAAA559, &H599555, &H95A59A, &H599695, &HAA6559, &H559555, &H55A59A, &H599695, &H95A59A, &H9A9AA9, &HAA5559, &H559555, &HA95559, &H555555, _ 
    &H55A599, &H599555, &HA95555, &H555555, &H55A559, &H599555, &HA5A6AA, &H9A9AA9, &HA95155, &H555555, &H55A559, &H559555, &H95A59A, &H5996A5, &HA55155, &H455555, _ 
    &H556559, &H559555, &H95A59A, &H5A9AA5, &HA55155, &H455554, &H555559, &H555555, &H55A599, &H599695, &H545559, &H555555, &H545555, &H595555, &H545555, &H555555, _ 
    &HA55155, &H454554, &H545155, &H555555, &HA55145, &H454554, &H545155, &H455555, &H955045, &H454554, &H505155, &H455555, &H955045, &H44554, &H505155, &H455554, _ 
    &H955045, &H44550, &H505145, &H454554, &H955045, &H44150, &H505045, &H454554, &H955044, &H44140, &H405045, &H44554, &H555044, &H44140, &H555555, &H555555, _ 
    &H405045, &H44550, &H555044, &H44000, &H555004, &H4000&, &H405045, &H44150, &H505045, &H54554, &H405044, &H44140, &H505045, &H44554, &H550004, &H0&, _ 
    &H5044&, &H44140, &H550000, &H0&, &H5044&, &H44000, &H540000, &H0&, &H5044&, &H4000&) 
 
' 1900-2100各年的二十四节气分布种类,对应上表中的序号,一个长整型保存4年序号,每8bit一个序号(序号=0-68) 
solarTermIdx = Array( _ 
    &H10203, &H4010503, &H4010503, &H6070809, &HA0B0C09, &HA0D0C0E, &HA0D010E, &HF000102, &H10000105, &H10000105, _ 
    &H10000105, &H11120708, &H13141508, &H13140D01, &H16140001, &H17180001, &H17180001, &H19180001, &H191A001B, &H1C1D1E0B, _ 
    &H1C1D1215, &H1F201421, &H22232400, &H22251800, &H22261800, &H22271800, &H22271D00, &H28291D1E, &H2A2B1D12, &H2C2D2024, _ 
    &H2E2F2324, &H302F2718, &H302F2718, &H302F271D, &H302F271D, &H3031291D, &H32332B1D, &H34352D23, &H36352D37, &H36382F37, _ 
    &H39382F27, &H39382F27, &H3A383127, &H3A3B312B, &H3A3B3C2B, &H3A3D3E2D, &H3F40352D, &H4140382F, &H4142382F, &H4344382F, _ 
    &H27000000) 

有了数据后,编码是非常简单的,只要由年份确定该年的二十节气分布种类,是69种里面的哪一种(查表方式),取出分布种类的定义信息后,再取某节气的偏差天数。最终返回 基准天数 + 偏差天数 即可。
代码比较简单,不再作详解(在参考代码里,用JS实现的代码,本函数只有一句代码)

附示例代码(在上次的代码基础上,加了公历转农历的方法,但请注意,目前尚未处理公历1900/1/1~农历1900/1/1之间的数据,因为参考代码中,信息表中未包含这段信息):

农历日期数据类型定义:
Option Explicit 
 
Type LunarDate 
    year As Long                '农历年份(西历纪年1900-2100) 
    month As Integer            '农历月份(1-12) 
    day As Integer              '农历日期(1-30) 
    isLeap As Boolean           '是否为闰月年(True=有闰月  Flas=无闰月) 
    solarIndex As Integer       '二十四节气(0-24) 0=当日没有节气 
End Type 



'根据农历年月日取对应公历日期 类模块 
'                                    (By 漠石 mostone@hotmail.com) 

'  本类只有一个公用方法: 
'    Public Function GetDateFromLunar(y As Long, m As Long, d As Long, Optional isLeap As Boolean = False) As Date 
'    y: 1900 - 2100 200年 
'    m: 1 - 12 月份 
'    d: 1 - 30,如果是小月,并且传入了30,则返回下一农历月第一天的公历 
'    isLeap: 是否为闰月 

'========================================================================================== 
'  注:本模块的数据及代码参照自:http://s.o4u.com/host/blog/calendar/calendar.htm 
'      以下为原作者信息: 
'        *************************************** 
'         農曆月曆&世界時間 DHTML 程式 (台灣版) 
'        *************************************** 
'             最後修改: 2009 年 3 月 20 日 


'如果您覺得這個程式不錯,您可以自由轉寄給親朋好友分享。自由使 
'用範圍: 學校、學會、公會、公司內部、程式研究、個人網站供人查 
'詢使用? 

'Open Source 不代表放棄著作權,任何形式之引用或轉載前請來信告 
'知。如需於「商業或營利」目的中使用此部份之程式碼或資料,需取 
'得本人書面授權。 

'最新版本與更新資訊於 http://sean.o4u.com/ap/calendar/ 公佈 


'                             歡迎來信互相討論研究與指正誤謬 
'                     連絡方式:http://sean.o4u.com/contact/ 
补充:综合编程 , 其他综合 ,

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,