1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 农历天干地支算法源代码大全(javascript vbscript C# flash C++ C等等)

农历天干地支算法源代码大全(javascript vbscript C# flash C++ C等等)

时间:2022-05-23 17:44:56

相关推荐

农历天干地支算法源代码大全(javascript vbscript C# flash C++ C等等)

农历天干地支算法源代码大全

(javascript、vbscript、C#、flash、C++、C等等)

WonSoft编

文章提供计算农历天干地支及当年属相的算法源程序,使用的语言为Javascript、VBScript、C#等。

一、C# 代码(1):

原来还准备自己写算法,并研究农历规则。发现那太难和麻烦了,光是农历的推算那就我等专门研究历法的人一下搞懂的。后来发现。NET类库也提供一些基础的农历类System.Globalization.ChineseLunisolarCalendar。我改装了一下如DateTime时间形式。代码如下。实现了 公历农历转换的功能。但是只能算到1900~2100年之间的。基本够日常使用了。源代码如下:

usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespaceSystem{<summary>///中国常用农历日期时间类///zj53hao@/zj53hao///</summary>classChinaDateTime{privateintyear,month,dayOfMonth;privateboolisLeap;publicDateTimetime;<summary>///获取当前日期的农历年///</summary>publicintYear{get{returnyear;}}<summary>///获取当前日期的农历月份///</summary>publicintMonth{get{returnmonth;}}<summary>///获取当前日期的农历月中天数///</summary>publicintDayOfMonth{get{returndayOfMonth;}}<summary>///获取当前日期是否为闰月中的日期///</summary>publicboolIsLeap{get{returnisLeap;}}System.Globalization.ChineseLunisolarCalendarcc;<summary>///返回指定公历日期的阴历时间///</summary>///<paramname="time"></param>publicChinaDateTime(DateTimetime){cc=newSystem.Globalization.ChineseLunisolarCalendar();if(time>cc.MaxSupportedDateTime||time<cc.MinSupportedDateTime)thrownewException("参数日期时间不在支持的范围内,支持范围:"+cc.MinSupportedDateTime.ToShortDateString()+"到"+cc.MaxSupportedDateTime.ToShortDateString());year=cc.GetYear(time);month=cc.GetMonth(time);dayOfMonth=cc.GetDayOfMonth(time);isLeap=cc.IsLeapMonth(year,month);if(isLeap)month-=1;this.time=time;}<summary>///返回当前日前的农历日期。///</summary>publicstaticChinaDateTimeNow{get{returnnewChinaDateTime(DateTime.Now);}}<summary>///返回指定农历年,月,日,是否为闰月的农历日期时间///</summary>///<paramname="Year"></param>///<paramname="Month"></param>///<paramname="DayOfMonth"></param>///<paramname="IsLeap"></param>publicChinaDateTime(intYear,intMonth,intDayOfMonth,boolIsLeap){if(Year>=cc.MaxSupportedDateTime.Year||Year<=cc.MinSupportedDateTime.Year)thrownewException("参数年份时间不在支持的范围内,支持范围:"+cc.MinSupportedDateTime.ToShortDateString()+"到"+cc.MaxSupportedDateTime.ToShortDateString());if(Month<1||Month>12)thrownewException("月份必须在1~12范围");cc=newSystem.Globalization.ChineseLunisolarCalendar();if(cc.GetLeapMonth(Year)!=Month&&IsLeap)thrownewException("指定的月份不是当年的闰月");if(cc.GetDaysInMonth(Year,IsLeap?Month+1:Month)<DayOfMonth||DayOfMonth<1)thrownewException("指定的月中的天数不在当前月天数有效范围");year=Year;month=Month;dayOfMonth=DayOfMonth;isLeap=IsLeap;time=DateTime.Now;}<summary>///获取当前农历日期的公历时间///</summary>publicDateTimeToDateTime(){returncc.ToDateTime(year,isLeap?month+1:month,dayOfMonth,time.Hour,time.Minute,time.Second,time.Millisecond);}<summary>///获取指定农历时间对应的公历时间///</summary>///<paramname="CnTime"></param>///<returns></returns>publicstaticDateTimeToDateTime(ChinaDateTimeCnTime){returnCnTime.ToDateTime();}<summary>///获取指定公历时间转换为农历时间///</summary>///<paramname="Time"></param>///<returns></returns>publicstaticChinaDateTimeToChinaDateTime(DateTimeTime){returnnewChinaDateTime(Time);}}}

二、C#代码(2):

1、农历类的使用

.net框架不支持直接将日期转换成农历格式的字符串,那么要将显示农历格式的日期,就只要自已写代码了。不过由于已经有了ChineseLunisolarCalendar类实现了公历转换为农历日期的功能,所以要写这样的代码也比较简单。需要用到ChineseLunisolarCalendar以下几个主要方法:

int GetYear (DateTime time) 获取指定公历日期的农历年份,使用的还是公历纪元。在每年的元旦之后春节之前农历的纪年会比公历小1,其它时候等于公历纪年。虽然农历使用传说中的耶稣生日纪元似乎不太妥当,不过我们确实已经几十年没有实行一个更好的纪年办法,也只有将就了。

int GetMonth (DateTime time) 获取指定公历日期的农历月份。这里要注意了,由于农历有接近三分之一的年份存在闰月,则在这些年份里会有十三个,而具体哪一个月是闰月也说不准,这里不同于希伯来历。以今年为例,今年闰七月,则此方法在参数为闰七月的日期是返回值为 8,参数为农历十二月的日期时返回值为13

bool IsLeapMonth ( int year, int month) 获取指定农历年份和月份是否为闰月,这个函数和上个函数配合使用就可以算出农历的月份了。

int GetDayOfMonth (DateTime time) 获取指定公历日期的农历天数,这个值根据大月或者小月取值是1到30或者1到29, MSDN上说的1到31显然是错的, 没有哪个农历月份会有31天。

int GetSexagenaryYear (DateTime time) 获取指定公历日期的农历年份的干支纪年,从1到60,分别是甲子、乙丑、丙寅、….癸亥, 比如戊戌变法、辛亥革命就是按这个来命名的。当然算八字也少不了这个。

int GetCelestialStem (int sexagenaryYear) 获取一个天支的天干, 从1到10, 表示甲、乙、丙….,说白了就是对10取模。

int GetTerrestrialBranch (int sexagenaryYear) ) 获取一个干支的地支,, 从1到12, 表示子、丑、寅、…今年是狗年,那么今年年份的地支就是“戌”。

有了这几个方法,显示某天的农历月份日期、农历节日等都是小菜一碟,算命先生排八字用这几个方法,又快又准确,写出的代码也很短。

2、几种东亚农历类的区别

经过我的测试,ChineseLunisolarCalendar, JapaneseLunisolarCalendar, KoreanLunisolaCalendarr, TaiwanLunisolarCalendar这四种日历,无论哪一种,以2月6日为参数,调用它们的GetMonth方法得到的结果都是1,GetDayOfMonth得到的结果都是8。想想也是,我们过的端午节和韩国的不太可能不是一天。

但是调用GetYear方法得到结果就有区别了ChineseLunisolarCalendar和KoreanLunisolarCalendar都返回,也就是公历纪年,TaiwanLunisolarCalendar的返回值是95,依然是民国纪年,JapaneseLunisolarCalendar的返回值是18, 平成纪年。

另外的一个区别是这四种日历的MinSupportedDateTime和MaxSupportedDateTime各不一样,以下是对照表:

韩国农历类支持的最小日期为9(也即高丽王朝建立的年份),以此而论,中国农历类支持的最小日期不说从商周算起,从汉唐算总该没问题吧?微软公司啊,又在“厚彼薄此”,唉。

其次,日本还以天皇纪年,如果哪天xxxx, 岂不是使用JapaneseLunisolarCalendar写出的程序都有问题啦?

3、写自已的日期格式化器

昨天看了一篇文章,说目前大家用的“农历”这个术语是文革时期才有的,目的是反封建。这里为了省事,还是继续使用这个术语。而英文名称ChineseLunisolarCalendar太长,我自己的代码中就用ChineseCalendar为相关功能命名,这个名字也还过得去吧。

我原先设想自定义一个类,使得能写出这样的代码:

strings=DateTime.Now.ToString(newMyFormatProvider());

就能得出我想要的农历日期字符串,经过测试却失败了,依据我的分析,微软公司在.net框架中把日期时间型的格式写死了,只能依据相关的地区采用固定的几种显示格式,没法再自行定义。而前文已经说过,而所有的相关格式微软公司都放到一个名为culture.nlp的文件中(这个文件在以前的.net框架是一个独立的文件,在.net 2.0被作为一个资源编译到mscorlib.dll中。) (我的这个不能为DateTime写自已的格式化器的观点没有资料佐证,如有不当之处,请大家指正)

虽然不能为DataTime写自定义的格式器,但还有另外一个途径,就是为String类的Format方法写自定义格式化器,我测试了一下,效果还不错,调用方式如下:

string s= String.Format(new ChineseCalendarFormatter(), "{0:D}",DateTime.Now);

可以得到“二〇〇六年正月初九”

string s= String.Format(new ChineseCalendarFormatter(), "{0:d}",DateTime.Now);

可以得到“丙戌年正月初九”

虽然没有前面所设想的方便,但也还能接受,全部代码帖出如下:

第一个类,主要是封装了农历的一些常用字符和对日历处理的最基本功能

usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.Globalization;publicstaticclassChineseCalendarHelper{publicstaticstringGetYear(DateTimetime){StringBuildersb=newStringBuilder();intyear=calendar.GetYear(time);intd;do{d=year%10;sb.Insert(0,ChineseNumber[d]);year=year/10;}while(year>0);returnsb.ToString();}publicstaticstringGetMonth(DateTimetime){intmonth=calendar.GetMonth(time);intyear=calendar.GetYear(time);intleap=0;//正月不可能闰月for(inti=3;i<=month;i++){if(calendar.IsLeapMonth(year,i)){leap=i;break;//一年中最多有一个闰月}}if(leap>0)month--;return(leap==month+1?"闰":"")+ChineseMonthName[month-1];}publicstaticstringGetDay(DateTimetime){returnChineseDayName[calendar.GetDayOfMonth(time)-1];}publicstaticstringGetStemBranch(DateTimetime){intsexagenaryYear=calendar.GetSexagenaryYear(time);stringstemBranch=CelestialStem.Substring(sexagenaryYear%10-1,1)+TerrestrialBranch.Substring(sexagenaryYear%12-1,1);returnstemBranch;}privatestaticChineseLunisolarCalendarcalendar=newChineseLunisolarCalendar();privatestaticstringChineseNumber="〇一二三四五六七八九";publicconststringCelestialStem="甲乙丙丁戊己庚辛壬癸";publicconststringTerrestrialBranch="子丑寅卯辰巳午未申酉戌亥";publicstaticreadonlystring[]ChineseDayName=newstring[]{"初一","初二","初三","初四","初五","初六","初七","初八","初九","初十","十一","十二","十三","十四","十五","十六","十七","十八","十九","二十","廿一","廿二","廿三","廿四","廿五","廿六","廿七","廿八","廿九","三十"};publicstaticreadonlystring[]ChineseMonthName=newstring[]{"正","二","三","四","五","六","七","八","九","十","十一","十二"};}

第二个类为自定义格式化器:

usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.Globalization;usingSystem.Threading;publicclassChineseCalendarFormatter:IFormatProvider,ICustomFormatter{//实现IFormatProviderpublicobjectGetFormat(TypeformatType){if(formatType==typeof(ICustomFormatter))returnthis;elsereturnThread.CurrentThread.CurrentCulture.GetFormat(formatType);}//实现ICustomFormatterpublicstringFormat(stringformat,objectarg,IFormatProviderformatProvider){strings;IFormattableformattable=argasIFormattable;if(formattable==null)s=arg.ToString();elses=formattable.ToString(format,formatProvider);if(arg.GetType()==typeof(DateTime)){DateTimetime=(DateTime)arg;switch(format){case"D"://长日期格式s=String.Format("{0}年{1}月{2}",ChineseCalendarHelper.GetYear(time),ChineseCalendarHelper.GetMonth(time),ChineseCalendarHelper.GetDay(time));break;case"d"://短日期格式s=String.Format("{0}年{1}月{2}",ChineseCalendarHelper.GetStemBranch(time),ChineseCalendarHelper.GetMonth(time),ChineseCalendarHelper.GetDay(time));break;case"M"://月日格式s=String.Format("{0}月{1}",ChineseCalendarHelper.GetMonth(time),ChineseCalendarHelper.GetDay(time));break;case"Y"://年月格式s=String.Format("{0}年{1}月",ChineseCalendarHelper.GetYear(time),ChineseCalendarHelper.GetMonth(time));break;default:s=String.Format("{0}年{1}月{2}",ChineseCalendarHelper.GetYear(time),ChineseCalendarHelper.GetMonth(time),ChineseCalendarHelper.GetDay(time));break;}}returns;}}

这段代码中间处理格式那部份稍做改进,就可以支持更多的日期格式。

有了这两段代码为原型,要实现计算和显示一个日期的农历日期及其它功能,基本上就很容易了。

三、VBScript 代码

<%'Wonsoft,Welcome to visit my web '***********************************************'类名称:ChinaDay'用途:'根据输入的日期计算该日期的农历天干地支及当年属相'使用方法:'第一个参数为输入参数,不填写默认为当日,'只计算1921-2-8之后的日期'##-------------------------------------------##'DimobjChinaDay'DimsDay,sWeekDay,sChinaDay,sChinaYear,sChinaAni'SetobjChinaDay=NewChinaDay'CallobjChinaDay.Action("",sDay,sWeekDay,sChinaYear,sChinaDay,sChinaAni)'Response.WritesDay&"<BR>"'Response.WritesWeekDay&"<BR>"'Response.WritesChinaYear&"<BR>"'Response.WritesChinaDay&"<BR>"'Response.WritesChinaAni&"<BR>"'##-------------------------------------------##'Copyright:本代码非原创,是2001年收集的,原作者未知。'License:Free'*******************************************************ClassChinaDayDimarrWeekName(7),MonthAdd(11),NongliData(99)DimarrTianGan(9),arrDiZhi(11),arrShuXiang(11),arrDayName(30),arrMonName(12)DimcurTime,curYear,curMonth,curDay,curWeekdayDimi,m,n,k,isEnd,bit,TheDate'初始化数据SubClass_Initialize()'---------------------------------------------------'定义显示字串'星期名arrWeekName(0)="*"arrWeekName(1)="星期日"arrWeekName(2)="星期一"arrWeekName(3)="星期二"arrWeekName(4)="星期三"arrWeekName(5)="星期四"arrWeekName(6)="星期五"arrWeekName(7)="星期六"'天干名称arrTianGan(0)="甲"arrTianGan(1)="乙"arrTianGan(2)="丙"arrTianGan(3)="丁"arrTianGan(4)="戊"arrTianGan(5)="己"arrTianGan(6)="庚"arrTianGan(7)="辛"arrTianGan(8)="壬"arrTianGan(9)="癸"'地支名称arrDiZhi(0)="子"arrDiZhi(1)="丑"arrDiZhi(2)="寅"arrDiZhi(3)="卯"arrDiZhi(4)="辰"arrDiZhi(5)="巳"arrDiZhi(6)="午"arrDiZhi(7)="未"arrDiZhi(8)="申"arrDiZhi(9)="酉"arrDiZhi(10)="戌"arrDiZhi(11)="亥"'属相名称arrShuXiang(0)="鼠"arrShuXiang(1)="牛"arrShuXiang(2)="虎"arrShuXiang(3)="兔"arrShuXiang(4)="龙"arrShuXiang(5)="蛇"arrShuXiang(6)="马"arrShuXiang(7)="羊"arrShuXiang(8)="猴"arrShuXiang(9)="鸡"arrShuXiang(10)="狗"arrShuXiang(11)="猪"'农历日期名arrDayName(0)="*"arrDayName(1)="初一"arrDayName(2)="初二"arrDayName(3)="初三"arrDayName(4)="初四"arrDayName(5)="初五"arrDayName(6)="初六"arrDayName(7)="初七"arrDayName(8)="初八"arrDayName(9)="初九"arrDayName(10)="初十"arrDayName(11)="十一"arrDayName(12)="十二"arrDayName(13)="十三"arrDayName(14)="十四"arrDayName(15)="十五"arrDayName(16)="十六"arrDayName(17)="十七"arrDayName(18)="十八"arrDayName(19)="十九"arrDayName(20)="二十"arrDayName(21)="廿一"arrDayName(22)="廿二"arrDayName(23)="廿三"arrDayName(24)="廿四"arrDayName(25)="廿五"arrDayName(26)="廿六"arrDayName(27)="廿七"arrDayName(28)="廿八"arrDayName(29)="廿九"arrDayName(30)="三十"'农历月份名arrMonName(0)="*"arrMonName(1)="正"arrMonName(2)="二"arrMonName(3)="三"arrMonName(4)="四"arrMonName(5)="五"arrMonName(6)="六"arrMonName(7)="七"arrMonName(8)="八"arrMonName(9)="九"arrMonName(10)="十"arrMonName(11)="十一"arrMonName(12)="腊"'---------------------------------------------------------'公差数据定义'公历每月前面的天数MonthAdd(0)=0MonthAdd(1)=31MonthAdd(2)=59MonthAdd(3)=90MonthAdd(4)=120MonthAdd(5)=151MonthAdd(6)=181MonthAdd(7)=212MonthAdd(8)=243MonthAdd(9)=273MonthAdd(10)=304MonthAdd(11)=334'农历数据NongliData(0)=2635NongliData(1)=333387NongliData(2)=1701NongliData(3)=1748NongliData(4)=267701NongliData(5)=694NongliData(6)=2391NongliData(7)=133423NongliData(8)=1175NongliData(9)=396438NongliData(10)=3402NongliData(11)=3749NongliData(12)=331177NongliData(13)=1453NongliData(14)=694NongliData(15)=26NongliData(16)=2350NongliData(17)=465197NongliData(18)=3221NongliData(19)=3402NongliData(20)=400202NongliData(21)=2901NongliData(22)=1386NongliData(23)=267611NongliData(24)=605NongliData(25)=2349NongliData(26)=137515NongliData(27)=2709NongliData(28)=464533NongliData(29)=1738NongliData(30)=2901NongliData(31)=330421NongliData(32)=1242NongliData(33)=2651NongliData(34)=199255NongliData(35)=1323NongliData(36)=529706NongliData(37)=3733NongliData(38)=1706NongliData(39)=398762NongliData(40)=2741NongliData(41)=1206NongliData(42)=267438NongliData(43)=2647NongliData(44)=1318NongliData(45)=204070NongliData(46)=3477NongliData(47)=461653NongliData(48)=1386NongliData(49)=2413NongliData(50)=330077NongliData(51)=1197NongliData(52)=2637NongliData(53)=268877NongliData(54)=3365NongliData(55)=531109NongliData(56)=2900NongliData(57)=2922NongliData(58)=398042NongliData(59)=2395NongliData(60)=1179NongliData(61)=267415NongliData(62)=2635NongliData(63)=661067NongliData(64)=1701NongliData(65)=1748NongliData(66)=398772NongliData(67)=2742NongliData(68)=2391NongliData(69)=330031NongliData(70)=1175NongliData(71)=1611NongliData(72)=200010NongliData(73)=3749NongliData(74)=527717NongliData(75)=1452NongliData(76)=2742NongliData(77)=332397NongliData(78)=2350NongliData(79)=3222NongliData(80)=268949NongliData(81)=3402NongliData(82)=3493NongliData(83)=133973NongliData(84)=1386NongliData(85)=464219NongliData(86)=605NongliData(87)=2349NongliData(88)=334123NongliData(89)=2709NongliData(90)=2890NongliData(91)=267946NongliData(92)=2773NongliData(93)=592565NongliData(94)=1210NongliData(95)=2651NongliData(96)=395863NongliData(97)=1323NongliData(98)=2707NongliData(99)=265877EndSub'############################################################'主要方法Action'inDay输入日期,如果不输入则默认为当前日期'sDay中文格式日期'sWeekDay周几'sChinaYear农历年'sChinaDay农历日'sChinaAni属相'############################################################PublicFunctionAction(inDay,sDay,sWeekDay,sChinaYear,sChinaDay,sChinaAni)'转换要转换的日期IfinDay=""OrNotIsDate(inDay)Then'获取当前系统时间curTime=Now()ElsecurTime=CDate(inDay)EndIfIfDatediff("d",curTime,Cdate("1921-2-8"))>0ThenExitFunctionEndIf'生成当前公历年、月、日==>sDaycurYear=Year(curTime)curMonth=Month(curTime)curDay=Day(curTime)sDay=curYear&"年"If(curMonth<10)ThensDaysDay=sDay&"0"&curMonth&"月"ElsesDaysDay=sDay&curMonth&"月"EndIfIf(curDay<10)ThensDaysDay=sDay&"0"&curDay&"日"ElsesDaysDay=sDay&curDay&"日"EndIf'生成当前公历星期==>sWeekDaycurWeekday=Weekday(curTime)sWeekDay=arrWeekName(curWeekday)'计算到初始时间192月8日的天数:1921-2-8(正月初一)TheDate=(curYear-1921)*365+Int((curYear-1921)/4)+curDay+MonthAdd(curMonth-1)-38If((curYearMod4)=0ANDcurMonth>2)ThenTheDateTheDate=TheDate+1EndIf'计算农历天干、地支、月、日isEnd=0m=0'------------------------------------DoIf(NongliData(m)<4095)Thenk=11Elsek=12Endifn=k'------------------------------------DoIf(n<0)ThenExitDoEndIf'获取NongliData(m)的第n个二进制位的值bit=NongliData(m)Fori=1TonStep1bit=Int(bit/2)Nextbitbit=bitMod2If(TheDate<=29+bit)ThenisEnd=1ExitDoEndIfTheDateTheDate=TheDate-29-bitnn=n-1Loop'------------------------------------If(isEnd=1)ThenExitDoEndIfmm=m+1Loop'------------------------------------curYear=1921+mcurMonth=k-n+1curDay=TheDateIf(k=12)ThenIf(curMonth=(Int(NongliData(m)/65536)+1))ThencurMonth=1-curMonthElseIf(curMonth>(Int(NongliData(m)/65536)+1))ThencurMonthcurMonth=curMonth-1EndifEndIf'生成农历天干、地支==>sChinaYearsChinaYear="农历"&arrTianGan(((curYear-4)Mod60)Mod10)&arrDiZhi(((curYear-4)Mod60)Mod12)&"年"'生成属相==>sChinaAnisChinaAni=arrShuXiang(((curYear-4)Mod60)Mod12)'生成农历月、日==>NongliDayStrIf(curMonth<1)ThensChinaDay="闰"&arrMonName(-1*curMonth)ElsesChinaDay=arrMonName(curMonth)EndIfsChinaDaysChinaDay=sChinaDay&"月"sChinaDaysChinaDay=sChinaDay&arrDayName(curDay)EndFunctionEndClass%>

四、JavaScript 代码

<!--中国农历开始--><SCRIPTlanguage=JavaScript><!--varlunarInfo=newArray(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)varAnimals=newArray("鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪");varGan=newArray("甲","乙","丙","丁","戊","己","庚","辛","壬","癸");varZhi=newArray("子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥");varnow=newDate();varSY=now.getYear();varSM=now.getMonth();varSD=now.getDate();//====传入offset传回干支,0=甲子functioncyclical(num){return(Gan[num%10]+Zhi[num%12])}//====传回农历y年的总天数functionlYearDays(y){vari,sum=348for(i=0x8000;i>0x8;i>>=1)sum+=(lunarInfo[y-1900]&i)?1:0return(sum+leapDays(y))}//====传回农历y年闰月的天数functionleapDays(y){if(leapMonth(y))return((lunarInfo[y-1900]&0x10000)?30:29)elsereturn(0)}//====传回农历y年闰哪个月1-12,没闰传回0functionleapMonth(y){return(lunarInfo[y-1900]&0xf)}//======================================传回农历y年m月的总天数functionmonthDays(y,m){return((lunarInfo[y-1900]&(0x10000>>m))?30:29)}//====算出农历,传入日期物件,传回农历日期物件//该物件属性有.year.month.day.isLeap.yearCyl.dayCyl.monCylfunctionLunar(objDate){vari,leap=0,temp=0varbaseDate=newDate(1900,0,31)varoffset=(objDate-baseDate)/86400000this.dayCyl=offset+40this.monCyl=14for(i=1900;i<2050&&offset>0;i++){temp=lYearDays(i)offset-=tempthis.monCyl+=12}if(offset<0){offset+=temp;i--;this.monCyl-=12}this.year=ithis.yearCyl=i-1864leap=leapMonth(i)//闰哪个月this.isLeap=falsefor(i=1;i<13&&offset>0;i++){//闰月if(leap>0&&i==(leap+1)&&this.isLeap==false){--i;this.isLeap=true;temp=leapDays(this.year);}else{temp=monthDays(this.year,i);}//解除闰月if(this.isLeap==true&&i==(leap+1))this.isLeap=falseoffset-=tempif(this.isLeap==false)this.monCyl++}if(offset==0&&leap>0&&i==leap+1)if(this.isLeap){this.isLeap=false;}else{this.isLeap=true;--i;--this.monCyl;}if(offset<0){offset+=temp;--i;--this.monCyl;}this.month=ithis.day=offset+1}functionYYMMDD(){varcl='<fontcolor="#0000df"STYLE="font-size:9pt;">';if(now.getDay()==0)cl='<fontcolor="#c00000"STYLE="font-size:9pt;">';if(now.getDay()==6)cl='<fontcolor="#00c000"STYLE="font-size:9pt;">';return(cl+SY+'年'+(SM+1)+'月'+SD+'日</font>');}functionweekday(){varday=newArray("星期日","星期一","星期二","星期三","星期四","星期五","星期六");varcl='<fontcolor="#ff0000"STYLE="font-size:9pt;">';if(now.getDay()==0)cl='<fontcolor="#c00000"STYLE="font-size:9pt;">';if(now.getDay()==6)cl='<fontcolor="#00c000"STYLE="font-size:9pt;">';return(cl+day[now.getDay()]+'</font>');}//====中文日期functioncDay(m,d){varnStr1=newArray('日','一','二','三','四','五','六','七','八','九','十');varnStr2=newArray('初','十','廿','卅','');vars;if(m>10){s='十'+nStr1[m-10]}else{s=nStr1[m]}s+='月'switch(d){case10:s+='初十';break;case20:s+='二十';break;case30:s+='三十';break;default:s+=nStr2[Math.floor(d/10)];s+=nStr1[d%10];}return(s);}functionsolarDay1(){varsDObj=newDate(SY,SM,SD);varlDObj=newLunar(sDObj);varcl='<fontcolor="violet"STYLE="font-size:9pt;">';vartt='【'+Animals[(SY-4)%12]+'】'+cyclical(lDObj.monCyl)+'月'+cyclical(lDObj.dayCyl++)+'日';return(cl+tt+'</font>');}functionsolarDay2(){varsDObj=newDate(SY,SM,SD);varlDObj=newLunar(sDObj);varcl='<fontcolor="#000066"STYLE="font-size:9pt;">';//农历BB'+(cld[d].isLeap?'闰':'')+cld[d].lMonth+'月'+cld[d].lDay+'日vartt=cyclical(SY-1900+36)+'年'+cDay(lDObj.month,lDObj.day);return(cl+tt+'</font>');}functionsolarDay3(){varsTermInfo=newArray(0,21208,42467,63836,85337,107014,128867,150921,173149,195551,218072,240693,263343,285989,308563,331033,353350,375494,397447,419210,440795,462224,483532,504758)varsolarTerm=newArray("小寒","大寒","立春","雨水","惊蛰","春分","清明","谷雨","立夏","小满","芒种","夏至","小暑","大暑","立秋","处暑","白露","秋分","寒露","霜降","立冬","小雪","大雪","冬至")varlFtv=newArray("0101*春节","0115元宵节","0505端午节","0707七夕情人节","0715中元节","0815中秋节","0909重阳节","1208腊八节","1224小年","0100*除夕")varsFtv=newArray("0101*元旦","0214情人节","0308妇女节","0312植树节","0315消费者权益日","0401愚人节","0501劳动节","0504青年节","0512护士节","0601儿童节","0701建党节香港回归纪念","0801建军节","0808父亲节","0908茂生日","0909毛泽东逝世纪念","0910教师节","0928孔子诞辰","1001*国庆节","1006老人节","1001ListenWind生日","1024联合国日","1112孙中山诞辰","1220澳门回归纪念","1225圣诞节","1226毛泽东诞辰")varsDObj=newDate(SY,SM,SD);varlDObj=newLunar(sDObj);varlDPOS=newArray(3)varfestival='',solarTerms='',solarFestival='',lunarFestival='',tmp1,tmp2;//农历节日for(iinlFtv)if(lFtv[i].match(/^(/d{2})(.{2})([/s/*])(.+)$/)){tmp1=Number(RegExp.$1)-lDObj.monthtmp2=Number(RegExp.$2)-lDObj.dayif(tmp1==0&&tmp2==0)lunarFestival=RegExp.$4}//国历节日for(iinsFtv)if(sFtv[i].match(/^(/d{2})(/d{2})([/s/*])(.+)$/)){tmp1=Number(RegExp.$1)-(SM+1)tmp2=Number(RegExp.$2)-SDif(tmp1==0&&tmp2==0)solarFestival=RegExp.$4}//节气tmp1=newDate((31556925974.7*(SY-1900)+sTermInfo[SM*2+1]*60000)+Date.UTC(1900,0,6,2,5))tmp2=tmp1.getUTCDate()if(tmp2==SD)solarTermsolarTerms=solarTerm[SM*2+1]tmp1=newDate((31556925974.7*(SY-1900)+sTermInfo[SM*2]*60000)+Date.UTC(1900,0,6,2,5))tmp2=tmp1.getUTCDate()if(tmp2==SD)solarTermsolarTerms=solarTerm[SM*2]if(solarTerms==''&&solarFestival==''&&lunarFestival=='')festival='';elsefestival='<TABLEWIDTH=100%BORDER=0CELLPADDING=2CELLSPACING=0BGCOLOR="#CCFFCC"><TR><TD>'+'<FONTCOLOR="#000000"STYLE="font-size:9pt;">'+solarTerms+''+solarFestival+''+lunarFestival+'</FONT></TD>'+'</TR></TABLE>';varcl='<fontcolor="#000066"STYLE="font-size:9pt;">';return(cl+festival+'</font>');}functionsetCalendar(){document.write('<tablealign=centerCELLPADDING=2CELLSPACING=0border=1><tr><tdbgcolor=#FEFEEF><tableborder=0CELLPADDING=0CELLSPACING=0><tr><tdalign=center>');document.write(YYMMDD()+''+weekday());document.write('</td></tr>');document.write('<tr><tdalign=center>');document.write(solarDay1());document.write('</td></tr><tr><tdalign=center>');document.write(solarDay2());document.write('</td></tr><tr><td>');document.write(solarDay3());document.write('</td></tr></table></td></tr></table>');}setCalendar();//--></SCRIPT><!--wonsoft()--><!--中国农历结束-->

上面的代码不支持Firefox,请使用查找、替换,把getYear()修改为getFullYear()就可以支持firefox了。

五、Flash代码:

农历FLASH源码、旧历FLASH日历、旧历FLASH时钟

在FLASH中,制作时钟、日历都不难。在网上搜索一下,也会有一大遍源码等着你去下载。但不知是我孤陋寡闻,还是咋地。在网上还没见过农历的代码,在民族文化如此繁荣的中国。竟然没有人来研究这个。实在是有点遗憾。花点时间,研究了一下。随后把源码附上。希望大家共同讨论。其中难的就是闰月部分。

点击播放/隐藏媒体:/taoshaw/study/jilishizhong/Taoshaw_Time.swf

制作过程,前面的就不说了。直接发代码吧。

新建一倒计时类"Taoshaw_data.as"。

然后输入如下代码:

classTaoshaw_dataextendsDate{//================版权声明开始================// //★淘沙网: //★淘沙网所有教程欢迎转载。不过请转载时注明出处。谢谢合作。 //================版权声明结束================// /*=============================================公元1900-2100两百年的农历类。类的调用方法说明getFullYear();获取新历年份getnewMonth();获取月份getDate()获取多少号.getSeconds();获取秒值getDay();获取星期几getHours();获取小时(整点)getMinutes();获取分数getTaosJYear();获取中国农历年.getTaoJMonth();获取中国农历月.getTaoJDay();获取中国农历日.getTaoJNianZhu();获取年柱getYueZhu();获取月柱getRiZhu();获取日柱getShiceng();获取时辰getJieQi();获取二十四节气=============================================*/privatevartao_txtnum_info=newArray(0x4bd8,0x4ae0,0xa570,0x54d5,0xd260,0xd950,0x5554,0x56af,0x9ad0,0x55d2,0x4ae0,0xa5b6,0xa4d0,0xd250,0xd255,0xb54f,0xd6a0,0xada2,0x95b0,0x4977,0x497f,0xa4b0,0xb4b5,0x6a50,0x6d40,0xab54,0x2b6f,0x9570,0x52f2,0x4970,0x6566,0xd4a0,0xea50,0x6a95,0x5adf,0x2b60,0x86e3,0x92ef,0xc8d7,0xc95f,0xd4a0,0xd8a6,0xb55f,0x56a0,0xa5b4,0x25df,0x92d0,0xd2b2,0xa950,0xb557,0x6ca0,0xb550,0x5355,0x4daf,0xa5b0,0x4573,0x52bf,0xa9a8,0xe950,0x6aa0,0xaea6,0xab50,0x4b60,0xaae4,0xa570,0x5260,0xf263,0xd950,0x5b57,0x56a0,0x96d0,0x4dd5,0x4ad0,0xa4d0,0xd4d4,0xd250,0xd558,0xb540,0xb6a0,0x95a6,0x95bf,0x49b0,0xa974,0xa4b0,0xb27a,0x6a50,0x6d40,0xaf46,0xab60,0x9570,0x4af5,0x4970,0x64b0,0x74a3,0xea50,0x6b58,0x5ac0,0xab60,0x96d5,0x92e0,0xc960,0xd954,0xd4a0,0xda50,0x7552,0x56a0,0xabb7,0x25d0,0x92d0,0xcab5,0xa950,0xb4a0,0xbaa4,0xad50,0x55d9,0x4ba0,0xa5b0,0x5176,0x52bf,0xa930,0x7954,0x6aa0,0xad50,0x5b52,0x4b60,0xa6e6,0xa4e0,0xd260,0xea65,0xd530,0x5aa0,0x76a3,0x96d0,0x4afb,0x4ad0,0xa4d0,0xd0b6,0xd25f,0xd520,0xdd45,0xb5a0,0x56d0,0x55b2,0x49b0,0xa577,0xa4b0,0xaa50,0xb255,0x6d2f,0xada0,0x4b63,0x937f,0x49f8,0x4970,0x64b0,0x68a6,0xea5f,0x6b20,0xa6c4,0xaaef,0x92e0,0xd2e3,0xc960,0xd557,0xd4a0,0xda50,0x5d55,0x56a0,0xa6d0,0x55d4,0x52d0,0xa9b8,0xa950,0xb4a0,0xb6a6,0xad50,0x55a0,0xaba4,0xa5b0,0x52b0,0xb273,0x6930,0x7337,0x6aa0,0xad50,0x4b55,0x4b6f,0xa570,0x54e4,0xd260,0xe968,0xd520,0xdaa0,0x6aa6,0x56df,0x4ae0,0xa9d4,0xa4d0,0xd150,0xf252,0xd520);privatevartao_txtsolarMonth=newArray(31,28,31,30,31,30,31,31,30,31,30,31);//定义私有函数干支等信息 privatevarGan=newArray("甲","乙","丙","丁","戊","己","庚","辛","壬","癸");privatevarZhi=newArray("子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥");privatevarAnimals=newArray("鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪");//农历节气 privatevartao_txtsolarTerm=newArray("小寒","大寒","立春","雨水","惊蛰","春分","清明","谷雨","立夏","小满","芒种","夏至","小暑","大暑","立秋","处暑","白露","秋分","寒露","霜降","立冬","小雪","大雪","冬至");privatevartao_txtsTermInfo=newArray(0,21208,42467,63836,85337,107014,128867,150921,173149,195551,218072,240693,263343,285989,308563,331033,353350,375494,397447,419210,440795,462224,483532,504758);privatevarnStr1=newArray('日','一','二','三','四','五','六','七','八','九','十');privatevarnStr2=newArray('初','十','廿','卅','□');privatevarmonthName=newArray("JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC");privatevarcyear:Number;privatevarcmonth:Number;privatevarcday:Number;privatevarisLeap:Boolean;privatevarnianzhu:String;privatevaryuezhu:String;privatevarrizhu:String;privatevarjie:String;publicfunctionTaoshaw_data(yearOrTimevalue:Number,month:Number,date:Number,hour:Number,minute:Number,second:Number,millisecond:Number){super(yearOrTimevalue,month,date,hour,minute,second,millisecond);varleap:Number=0;vartemp:Number=0;vary:Number,m:Number,d;Number;y=getFullYear();m=getMonth();d=getDate();varoffset=(Date.UTC(y,m,d)-Date.UTC(1900,0,31))/86400000;for(vari=1900;i<2100&&offset>0;i++){temp=lYearDays(i);offset-=temp;}if(offset<0){offset+=temp;i--;}cyear=i;leap=leapMonth(i);isLeap=false;for(vari=1;i<13&&offset>0;i++){if(leap>0&&i==(leap+1)&&isLeap==false){--i;isLeap=true;temp=leapDays(cyear);}else{temp=monthDays(cyear,i);}if(isLeap==true&&i==(leap+1)){isLeap=false;}offset-=temp;}if(offset==0&&leap>0&&i==leap+1){if(isLeap){isLeap=false;}else{isLeap=true;--i;}}if(offset<0){offset+=temp;--i;}cmonth=i;cday=offset+1;varcY,cM,cD;if(m<2){cY=cyclical(y-1900+36-1);}else{cY=cyclical(y-1900+36);}cM=cyclical((y-1900)*12+m+12);vartmp1=sTerm(y,m*2);vartmp2=sTerm(y,m*2+1);if(d==tmp1){jie=tao_txtsolarTerm[m*2];}else{if(d==tmp2){jie=tao_txtsolarTerm[m*2+1];}else{jie="";}}this.jie=jie;//--------------------------------------------- varterm2=sTerm(y,2);varfirstNode=sTerm(y,m*2);if(m==1&&d>=term2){cY=cyclical(y-1900+36);trace("新年柱"+cY);}if((d+1)>=firstNode){cM=cyclical((y-1900)*12+m+13);}vardayCyclical=Date.UTC(y,m,1,0,0,0,0)/86400000+25567+10;cD=cyclical(dayCyclical+d-1);nianzhu=cY;yuezhu=cM;rizhu=cD;}publicfunctiongetTaosJYear():Number{returncyear;}publicfunctiongetTaoJMonth():Number{returncmonth;}publicfunctiongetTaoJDay():Number{returncday;}//getmonth()得到的比当前月份小1.因为是以数组形式来存储月份的。下标是从0-11. publicfunctiongetnewMonth():Number{returngetMonth()+1;}publicfunctiongetTaoJNianZhu():String{returnnianzhu;}publicfunctiongetYueZhu():String{returnyuezhu;}publicfunctiongetRiZhu():String{returnrizhu;}publicfunctiongetJieQi():String{returnjie;}publicfunctiongetShiceng():String{returnZhi[Math.round((getHours()%23)/2)]+"时";}privatefunctionlYearDays(y){varsum:Number=348;for(vari=0x8000;i>0x8;i>>=1){sum+=(tao_txtnum_info[y-1900]&i)?1:0;}return(sum+leapDays(y));}privatefunctionleapDays(y){if(leapMonth(y)){return((tao_txtnum_info[y-1899]&0xf)==0xf?30:29);}else{return(0);}}privatefunctionleapMonth(y){varlm=tao_txtnum_info[y-1900]&0xf;return(lm==0xf?0:lm);}privatefunctionmonthDays(y,m){return((tao_txtnum_info[y-1900]&(0x10000>>m))?30:29);}privatefunctionsTerm(y,n){varoffDate=newDate((31556925974.7*(y-1900)+tao_txtsTermInfo[n]*60000)+Date.UTC(1900,0,6,2,5));return(offDate.getUTCDate());}privatefunctionsolarDays(y,m){if(m==1){return(((y%4==0)&&(y%100!=0)||(y%400==0))?29:28);}else{return(tao_txtsolarMonth[m]);}}privatefunctioncyclical(num){return(Gan[num%10]+Zhi[num%12]);}}保存。2、用法上面也写得有。在FLASH中调用的时候。请参考如下代码:/*getFullYear();获取新历年份getnewMonth();获取月份,如果像本例这样,独立用数组表示,就直接用getMonth()获取,因为数组会少一个值.是从0开始的.getDate()获取多少号.getSeconds();获取秒值getDay();获取星期几getHours();获取小时(整点)getMinutes();获取分数getTaosJYear();获取中国农历年.getTaoJMonth();获取中国农历月.getTaoJDay();获取中国农历日.getTaoJNianZhu();获取年柱getYueZhu();获取月柱getRiZhu();获取日柱getShiceng();获取时辰getJieQi();获取二十四节气*///定义新Taoshaw_data类,因为Taoshaw_data类继承于data类,所以在此直接使用此类即可. //需要实时更新时,就加onEnterFrame函数. onEnterFrame=function(){varmy_data:Taoshaw_data=newTaoshaw_data();//定义两个数组,用于显示**月,以及星期* varmy_xingqi:Array=newArray();my_xingqi=["星期日","星期一","星期二","星期三","星期四","星期五","星期六"];varmy_yuefen:Array=newArray();my_yuefen=["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"];//定义变量myhaoshu获取当前日的号数 varmyhaoshu=my_data.getDate();//当数值小于10的时候,就在前面添加一个0; varmiao=my_data.getSeconds();varfen=my_data.getMinutes();if(fen<10){fen="0"+fen;}else{}if(miao<10){miao="0"+miao;}else{}if(myhaoshu<10){myhaoshu="0"+myhaoshu;}else{}show_txt.text="现在是"+my_data.getFullYear()+"年"+my_yuefen[my_data.getMonth()]+myhaoshu+"号"+my_xingqi[my_data.getDay()]+my_data.getHours()+"时"+fen+"分"+miao+"秒。"+"旧历"+my_data.getTaosJYear()+"."+my_data.getTaoJMonth()+"."+my_data.getTaoJDay()+"农历"+my_data.getTaoJNianZhu()+"年"+my_data.getYueZhu()+"月"+my_data.getRiZhu()+"日"+my_data.getShiceng()+my_data.getJieQi();};

源码下载:/source/830951

六、C++代码

1、头文件

//xDate.h /************************************************************************************************************Author:xShandowDest:ADateClassForC++Email:chenzg@HomePage:DevEnv:VisualC++6.0OS.:Windows2000ProfessinalDate:-NOV-15************************************************************************************************************/#ifndefXDATE_H #defineXDATE_H #include<windows.h> externconstWORDSTART_YEAR;externconstWORDEND_YEAR;classxDate{private:WORDm_iYear,m_iMonth,m_iDay;voidl_InitData();//计算从1901年1月1日过iSpanDays天后的阴历日期 staticvoidl_CalcLunarDate(WORD&iYear,WORD&iMonth,WORD&iDay,LONGiSpanDays);//计算公历iYear年iMonth月iDay日对应的节气0-24,0表不是节气 staticWORDl_GetLunarHolDay(WORDiYear,WORDiMonth,WORDiDay);public://=====================================================================================// xDate(WORDiYear,WORDiMonth,WORDiDay);xDate();//=====================================================================================// WORDGetYear(){returnm_iYear;}WORDGetMonth(){returnm_iMonth;}WORDGetDay(){returnm_iDay;}//=====================================================================================// voidGetDate(WORD&iYear,WORD&iMonth,WORD&iDay);BOOLSetDate(WORDiYear,WORDiMonth,WORDiDay);//=====================================================================================// //判断iYear是不是闰年 staticBOOLIsLeapYear(WORDiYear){return!(iYear%4)&&(iYear%100)||!(iYear%400);}//计算iYear,iMonth,iDay对应是星期几1年1月1日---65535年12月31日 staticWORDWeekDay(WORDiYear,WORDiMonth,WORDiDay);//返回iYear年iMonth月的天数1年1月---65535年12月 staticWORDMonthDays(WORDiYear,WORDiMonth);//返回阴历iLunarYer年阴历iLunarMonth月的天数,如果iLunarMonth为闰月, //高字为第二个iLunarMonth月的天数,否则高字为0 //1901年1月---2050年12月 staticLONGLunarMonthDays(WORDiLunarYear,WORDiLunarMonth);//返回阴历iLunarYear年的总天数 //1901年1月---2050年12月 staticWORDLunarYearDays(WORDiLunarYear);//返回阴历iLunarYear年的闰月月份,如没有返回0 //1901年1月---2050年12月 staticWORDGetLeapMonth(WORDiLunarYear);//把iYear年格式化成天干记年法表示的字符串 staticvoidFormatLunarYear(WORDiYear,char*pBuffer);//把iMonth格式化成中文字符串 staticvoidFormatMonth(WORDiMonth,char*pBuffer,BOOLbLunar=TRUE);//把iDay格式化成中文字符串 staticvoidFormatLunarDay(WORDiDay,char*pBuffer);//计算公历两个日期间相差的天数1年1月1日---65535年12月31日 staticLONGCalcDateDiff(WORDiEndYear,WORDiEndMonth,WORDiEndDay,WORDiStartYear=START_YEAR,WORDiStartMonth=1,WORDiStartDay=1);//计算公历iYear年iMonth月iDay日对应的阴历日期,返回对应的阴历节气0-24 //1901年1月1日---2050年12月31日 staticWORDGetLunarDate(WORDiYear,WORDiMonth,WORDiDay,WORD&iLunarYear,WORD&iLunarMonth,WORD&iLunarDay);};#endif//XDATE_H

2、实现文件

//xDate.cpp #include"xDate.h" //#include<windows.h> externWORDgLunarMonthDay[];externBYTEgLunarMonth[];externBYTEgLunarHolDay[];constWORDSTART_YEAR=1901;constWORDEND_YEAR=2050;//===========================================================================// voidxDate::l_InitData(){SYSTEMTIMEsystime;::GetSystemTime(&systime);m_iYear=systime.wYear;m_iMonth=systime.wMonth;m_iDay=systime.wDay;}//===========================================================================// xDate::xDate(WORDiYear,WORDiMonth,WORDiDay){if(!SetDate(iYear,iMonth,iDay))l_InitData();}//===========================================================================// xDate::xDate(){l_InitData();}//===========================================================================// LONGxDate::CalcDateDiff(WORDiEndYear,WORDiEndMonth,WORDiEndDay,WORDiStartYear,WORDiStartMonth,WORDiStartDay){WORDmonthday[]={0,31,59,90,120,151,181,212,243,273,304,334};//计算两个年份1月1日之间相差的天数 LONGiDiffDays=(iEndYear-iStartYear)*365;iDiffDays+=(iEndYear-1)/4-(iStartYear-1)/4;iDiffDays-=((iEndYear-1)/100-(iStartYear-1)/100);iDiffDays+=(iEndYear-1)/400-(iStartYear-1)/400;//加上iEndYear年1月1日到iEndMonth月iEndDay日之间的天数 iDiffDays+=monthday[iEndMonth-1]+(IsLeapYear(iEndYear)&&iEndMonth>2?1:0);iDiffDays+=iEndDay;//减去iStartYear年1月1日到iStartMonth月iStartDay日之间的天数 iDiffDays-=(monthday[iStartMonth-1]+(IsLeapYear(iStartYear)&&iStartMonth>2?1:0));iDiffDays-=iStartDay;returniDiffDays;}//===========================================================================// voidxDate::l_CalcLunarDate(WORD&iYear,WORD&iMonth,WORD&iDay,LONGiSpanDays){//阳历1901年2月19日为阴历1901年正月初一 //阳历1901年1月1日到2月19日共有49天 if(iSpanDays<49){iYear=START_YEAR-1;if(iSpanDays<19){iMonth=11;iDay=11+WORD(iSpanDays);}else{iMonth=12;iDay=WORD(iSpanDays)-18;}return;}//下面从阴历1901年正月初一算起 iSpanDays-=49;iYear=START_YEAR;iMonth=1;iDay=1;//计算年 LONGtmp=LunarYearDays(iYear);while(iSpanDays>=tmp){iSpanDays-=tmp;tmp=LunarYearDays(++iYear);}//计算月 tmp=LOWORD(LunarMonthDays(iYear,iMonth));while(iSpanDays>=tmp){iSpanDays-=tmp;if(iMonth==GetLeapMonth(iYear)){tmp=HIWORD(LunarMonthDays(iYear,iMonth));if(iSpanDays<tmp)break;iSpanDays-=tmp;}tmp=LOWORD(LunarMonthDays(iYear,++iMonth));}//计算日 iDay+=WORD(iSpanDays);}//===========================================================================// WORDxDate::GetLunarDate(WORDiYear,WORDiMonth,WORDiDay,WORD&iLunarYear,WORD&iLunarMonth,WORD&iLunarDay){l_CalcLunarDate(iLunarYear,iLunarMonth,iLunarDay,CalcDateDiff(iYear,iMonth,iDay));returnl_GetLunarHolDay(iYear,iMonth,iDay);}//===========================================================================// //根据节气数据存储格式,计算阳历iYear年iMonth月iDay日对应的节气, WORDxDate::l_GetLunarHolDay(WORDiYear,WORDiMonth,WORDiDay){BYTE&flag=gLunarHolDay[(iYear-START_YEAR)*12+iMonth-1];WORDday;if(iDay<15)day=15-((flag>>4)&0x0f);elseday=((flag)&0x0f)+15;if(iDay==day)return(iMonth-1)*2+(iDay>15?1:0)+1;elsereturn0;}//===========================================================================// voidxDate::GetDate(WORD&iYear,WORD&iMonth,WORD&iDay){iYear=m_iYear;iMonth=m_iMonth;iDay=m_iDay;}//===========================================================================// BOOLxDate::SetDate(WORDiYear,WORDiMonth,WORDiDay){if(iYear<START_YEAR||iYear>END_YEAR||iMonth<1||iMonth>12)returnFALSE;if(iDay<1||iDay>MonthDays(iYear,iMonth))returnFALSE;m_iYear=iYear;m_iMonth=iMonth;m_iDay=iDay;returnTRUE;}//===========================================================================// WORDxDate::WeekDay(WORDiYear,WORDiMonth,WORDiDay){//数组元素monthday表示第i个月以前的总天数除以7的余数 WORDmonthday[]={0,3,3,6,1,4,6,2,5,0,3,5};WORDiDays=(iYear-1)%7+(iYear-1)/4-(iYear-1)/100+(iYear-1)/400;iDays+=(monthday[iMonth-1]+iDay);//如果iYear是闰年 if(IsLeapYear(iYear)&&iMonth>2)iDays++;//返回:0,1,2,3,4,5,6表日、一、二、三、四、五、六 returniDays%7;}//===========================================================================// WORDxDate::MonthDays(WORDiYear,WORDiMonth){switch(iMonth){case1://一(月) case3://三(月) case5://五(月) case7://七(月) case8://八(月) case10://十(月) case12://十二(月) return31;case4://四(月) case6://六(月) case9://九(月) case11://十一(月) return30;case2://二(月) //如果是闰年 if(IsLeapYear(iYear))return29;elsereturn28;}return0;}//===========================================================================// WORDxDate::GetLeapMonth(WORDiLunarYear){BYTE&flag=gLunarMonth[(iLunarYear-START_YEAR)/2];return(iLunarYear-START_YEAR)%2?flag&0x0f:flag>>4;}//===========================================================================// LONGxDate::LunarMonthDays(WORDiLunarYear,WORDiLunarMonth){if(iLunarYear<START_YEAR)return30L;WORDheight=0,low=29;intiBit=16-iLunarMonth;if(iLunarMonth>GetLeapMonth(iLunarYear)&&GetLeapMonth(iLunarYear))iBit--;if(gLunarMonthDay[iLunarYear-START_YEAR]&(1<<iBit))low++;if(iLunarMonth==GetLeapMonth(iLunarYear))if(gLunarMonthDay[iLunarYear-START_YEAR]&(1<<(iBit-1)))height=30;elseheight=29;returnMAKELONG(low,height);}//===========================================================================// WORDxDate::LunarYearDays(WORDiLunarYear){/*WORDdays=348;//12*29intmonth=12;//如果iYear年有闰月,则为13个月if(gLanarMonth[iYear-START_YEAR])month++;//如果某月是三十天则days++while(month>=0&&(gLanarMonthDay[iYear-START_YEAR]&(1<<(16-month)))){days++;month--;}returndays;*/WORDdays=0;for(WORDi=1;i<=12;i++){LONGtmp=LunarMonthDays(iLunarYear,i);days+=HIWORD(tmp);days+=LOWORD(tmp);}returndays;}//===========================================================================// voidxDate::FormatLunarYear(WORDiYear,char*pBuffer){charszText1[]="甲乙丙丁戊己庚辛壬癸";charszText2[]="子丑寅卯辰巳午未申酉戌亥";charszText3[]="鼠牛虎免龙蛇马羊猴鸡狗猪";memcpy(pBuffer,szText1+((iYear-4)%10)*2,2);memcpy(pBuffer+2,szText2+((iYear-4)%12)*2,2);pBuffer[4]='';memcpy(pBuffer+5,szText3+((iYear-4)%12)*2,2);strcpy(pBuffer+7,"年");}//===========================================================================// voidxDate::FormatMonth(WORDiMonth,char*pBuffer,BOOLbLunar){if(!bLunar&&iMonth==1){strcpy(pBuffer,"一月");return;}charszText[]="正二三四五六七八九十";if(iMonth<=10){memcpy(pBuffer,"",2);memcpy(pBuffer+2,szText+(iMonth-1)*2,2);strcpy(pBuffer+4,"月");return;}if(iMonth==11)strcpy(pBuffer,"十一");elsestrcpy(pBuffer,"十二");strcpy(pBuffer+4,"月");}//===========================================================================// voidxDate::FormatLunarDay(WORDiDay,char*pBuffer){charszText1[]="初十廿三";charszText2[]="一二三四五六七八九十";if(iDay!=20&&iDay!=30){memcpy(pBuffer,szText1+(iDay-1)/10*2,2);memcpy(pBuffer+2,szText2+((iDay-1)%10)*2,2);pBuffer[4]='/0';}else{memcpy(pBuffer,szText1+iDay/10*2,2);strcpy(pBuffer+2,szText2+18);}}/******************************************************************************下面为阴历计算所需的数据,为节省存储空间,所以采用下面比较变态的存储方法.*******************************************************************************///数组gLunarDay存入阴历1901年到2100年每年中的月天数信息, //阴历每月只能是29或30天,一年用12(或13)个二进制位表示,对应位为1表30天,否则为29天 WORDgLunarMonthDay[]={//测试数据只有1901.1.1--2050.12.31 0X4ae0,0Xa570,0X5268,0Xd260,0Xd950,0X6aa8,0X56a0,0X9ad0,0X4ae8,0X4ae0,//1910 0Xa4d8,0Xa4d0,0Xd250,0Xd548,0Xb550,0X56a0,0X96d0,0X95b0,0X49b8,0X49b0,//1920 0Xa4b0,0Xb258,0X6a50,0X6d40,0Xada8,0X2b60,0X9570,0X4978,0X4970,0X64b0,//1930 0Xd4a0,0Xea50,0X6d48,0X5ad0,0X2b60,0X9370,0X92e0,0Xc968,0Xc950,0Xd4a0,//1940 0Xda50,0Xb550,0X56a0,0Xaad8,0X25d0,0X92d0,0Xc958,0Xa950,0Xb4a8,0X6ca0,//1950 0Xb550,0X55a8,0X4da0,0Xa5b0,0X52b8,0X52b0,0Xa950,0Xe950,0X6aa0,0Xad50,//1960 0Xab50,0X4b60,0Xa570,0Xa570,0X5260,0Xe930,0Xd950,0X5aa8,0X56a0,0X96d0,//1970 0X4ae8,0X4ad0,0Xa4d0,0Xd268,0Xd250,0Xd528,0Xb540,0Xb6a0,0X96d0,0X95b0,//1980 0X49b0,0Xa4b8,0Xa4b0,0Xb258,0X6a50,0X6d40,0Xada0,0Xab60,0X9370,0X4978,//1990 0X4970,0X64b0,0X6a50,0Xea50,0X6b28,0X5ac0,0Xab60,0X9368,0X92e0,0Xc960,//2000 0Xd4a8,0Xd4a0,0Xda50,0X5aa8,0X56a0,0Xaad8,0X25d0,0X92d0,0Xc958,0Xa950,// 0Xb4a0,0Xb550,0Xb550,0X55a8,0X4ba0,0Xa5b0,0X52b8,0X52b0,0Xa930,0X74a8,// 0X6aa0,0Xad50,0X4da8,0X4b60,0X9570,0Xa4e0,0Xd260,0Xe930,0Xd530,0X5aa0,//2030 0X6b50,0X96d0,0X4ae8,0X4ad0,0Xa4d0,0Xd258,0Xd250,0Xd520,0Xdaa0,0Xb5a0,//2040 0X56d0,0X4ad8,0X49b0,0Xa4b8,0Xa4b0,0Xaa50,0Xb528,0X6d20,0Xada0,0X55b0,//2050 };//数组gLanarMonth存放阴历1901年到2050年闰月的月份,如没有则为0,每字节存两年 BYTEgLunarMonth[]={0X00,0X50,0X04,0X00,0X20,//1910 0X60,0X05,0X00,0X20,0X70,//1920 0X05,0X00,0X40,0X02,0X06,//1930 0X00,0X50,0X03,0X07,0X00,//1940 0X60,0X04,0X00,0X20,0X70,//1950 0X05,0X00,0X30,0X80,0X06,//1960 0X00,0X40,0X03,0X07,0X00,//1970 0X50,0X04,0X08,0X00,0X60,//1980 0X04,0X0a,0X00,0X60,0X05,//1990 0X00,0X30,0X80,0X05,0X00,//2000 0X40,0X02,0X07,0X00,0X50,// 0X04,0X09,0X00,0X60,0X04,// 0X00,0X20,0X60,0X05,0X00,//2030 0X30,0Xb0,0X06,0X00,0X50,//2040 0X02,0X07,0X00,0X50,0X03//2050 };//数组gLanarHoliDay存放每年的二十四节气对应的阳历日期 //每年的二十四节气对应的阳历日期几乎固定,平均分布于十二个月中 //1月2月3月4月5月6月 //小寒大寒立春雨水惊蛰春分清明谷雨立夏小满芒种夏至 //7月8月9月10月11月12月 //小暑大暑立秋处暑白露秋分寒露霜降立冬小雪大雪冬至 /*********************************************************************************节气无任何确定规律,所以只好存表,要节省空间,所以....下面这种存法实在是太变态了,你就将就着看吧**********************************************************************************///数据格式说明: //如1901年的节气为 //1月2月3月4月5月6月7月8月9月10月11月12月 //6,21,4,19,6,21,5,21,6,22,6,22,8,23,8,24,8,24,8,24,8,23,8,22 //9,6,11,4,9,6,10,6,9,7,9,7,7,8,7,9,7,9,7,9,7,8,7,15 //上面第一行数据为每月节气对应日期,15减去每月第一个节气,每月第二个节气减去15得第二行 //这样每月两个节气对应数据都小于16,每月用一个字节存放,高位存放第一个节气数据,低位存放 //第二个节气的数据,可得下表 BYTEgLunarHolDay[]={0X96,0XB4,0X96,0XA6,0X97,0X97,0X78,0X79,0X79,0X69,0X78,0X77,//1901 0X96,0XA4,0X96,0X96,0X97,0X87,0X79,0X79,0X79,0X69,0X78,0X78,//1902 0X96,0XA5,0X87,0X96,0X87,0X87,0X79,0X69,0X69,0X69,0X78,0X78,//1903 0X86,0XA5,0X96,0XA5,0X96,0X97,0X88,0X78,0X78,0X79,0X78,0X87,//1904 0X96,0XB4,0X96,0XA6,0X97,0X97,0X78,0X79,0X79,0X69,0X78,0X77,//1905 0X96,0XA4,0X96,0X96,0X97,0X97,0X79,0X79,0X79,0X69,0X78,0X78,//1906 0X96,0XA5,0X87,0X96,0X87,0X87,0X79,0X69,0X69,0X69,0X78,0X78,//1907 0X86,0XA5,0X96,0XA5,0X96,0X97,0X88,0X78,0X78,0X69,0X78,0X87,//1908 0X96,0XB4,0X96,0XA6,0X97,0X97,0X78,0X79,0X79,0X69,0X78,0X77,//1909 0X96,0XA4,0X96,0X96,0X97,0X97,0X79,0X79,0X79,0X69,0X78,0X78,//1910 0X96,0XA5,0X87,0X96,0X87,0X87,0X79,0X69,0X69,0X69,0X78,0X78,//1911 0X86,0XA5,0X96,0XA5,0X96,0X97,0X88,0X78,0X78,0X69,0X78,0X87,//1912 0X95,0XB4,0X96,0XA6,0X97,0X97,0X78,0X79,0X79,0X69,0X78,0X77,//1913 0X96,0XB4,0X96,0XA6,0X97,0X97,0X79,0X79,0X79,0X69,0X78,0X78,//1914 0X96,0XA5,0X97,0X96,0X97,0X87,0X79,0X79,0X69,0X69,0X78,0X78,//1915 0X96,0XA5,0X96,0XA5,0X96,0X97,0X88,0X78,0X78,0X79,0X77,0X87,//1916 0X95,0XB4,0X96,0XA6,0X96,0X97,0X78,0X79,0X78,0X69,0X78,0X87,//1917 0X96,0XB4,0X96,0XA6,0X97,0X97,0X79,0X79,0X79,0X69,0X78,0X77,//1918 0X96,0XA5,0X97,0X96,0X97,0X87,0X79,0X79,0X69,0X69,0X78,0X78,//1919 0X96,0XA5,0X96,0XA5,0X96,0X97,0X88,0X78,0X78,0X79,0X77,0X87,//1920 0X95,0XB4,0X96,0XA5,0X96,0X97,0X78,0X79,0X78,0X69,0X78,0X87,//1921 0X96,0XB4,0X96,0XA6,0X97,0X97,0X79,0X79,0X79,0X69,0X78,0X77,//1922 0X96,0XA4,0X96,0X96,0X97,0X87,0X79,0X79,0X69,0X69,0X78,0X78,//1923 0X96,0XA5,0X96,0XA5,0X96,0X97,0X88,0X78,0X78,0X79,0X77,0X87,//1924 0X95,0XB4,0X96,0XA5,0X96,0X97,0X78,0X79,0X78,0X69,0X78,0X87,//1925 0X96,0XB4,0X96,0XA6,0X97,0X97,0X78,0X79,0X79,0X69,0X78,0X77,//1926 0X96,0XA4,0X96,0X96,0X97,0X87,0X79,0X79,0X79,0X69,0X78,0X78,//1927 0X96,0XA5,0X96,0XA5,0X96,0X96,0X88,0X78,0X78,0X78,0X87,0X87,//1928 0X95,0XB4,0X96,0XA5,0X96,0X97,0X88,0X78,0X78,0X79,0X77,0X87,//1929 0X96,0XB4,0X96,0XA6,0X97,0X97,0X78,0X79,0X79,0X69,0X78,0X77,//1930 0X96,0XA4,0X96,0X96,0X97,0X87,0X79,0X79,0X79,0X69,0X78,0X78,//1931 0X96,0XA5,0X96,0XA5,0X96,0X96,0X88,0X78,0X78,0X78,0X87,0X87,//1932 0X95,0XB4,0X96,0XA5,0X96,0X97,0X88,0X78,0X78,0X69,0X78,0X87,//1933 0X96,0XB4,0X96,0XA6,0X97,0X97,0X78,0X79,0X79,0X69,0X78,0X77,//1934 0X96,0XA4,0X96,0X96,0X97,0X97,0X79,0X79,0X79,0X69,0X78,0X78,//1935 0X96,0XA5,0X96,0XA5,0X96,0X96,0X88,0X78,0X78,0X78,0X87,0X87,//1936 0X95,0XB4,0X96,0XA5,0X96,0X97,0X88,0X78,0X78,0X69,0X78,0X87,//1937 0X96,0XB4,0X96,0XA6,0X97,0X97,0X78,0X79,0X79,0X69,0X78,0X77,//1938 0X96,0XA4,0X96,0X96,0X97,0X97,0X79,0X79,0X79,0X69,0X78,0X78,//1939 0X96,0XA5,0X96,0XA5,0X96,0X96,0X88,0X78,0X78,0X78,0X87,0X87,//1940 0X95,0XB4,0X96,0XA5,0X96,0X97,0X88,0X78,0X78,0X69,0X78,0X87,//1941 0X96,0XB4,0X96,0XA6,0X97,0X97,0X78,0X79,0X79,0X69,0X78,0X77,//1942 0X96,0XA4,0X96,0X96,0X97,0X97,0X79,0X79,0X79,0X69,0X78,0X78,//1943 0X96,0XA5,0X96,0XA5,0XA6,0X96,0X88,0X78,0X78,0X78,0X87,0X87,//1944 0X95,0XB4,0X96,0XA5,0X96,0X97,0X88,0X78,0X78,0X79,0X77,0X87,//1945 0X95,0XB4,0X96,0XA6,0X97,0X97,0X78,0X79,0X78,0X69,0X78,0X77,//1946 0X96,0XB4,0X96,0XA6,0X97,0X97,0X79,0X79,0X79,0X69,0X78,0X78,//1947 0X96,0XA5,0XA6,0XA5,0XA6,0X96,0X88,0X88,0X78,0X78,0X87,0X87,//1948 0XA5,0XB4,0X96,0XA5,0X96,0X97,0X88,0X79,0X78,0X79,0X77,0X87,//1949 0X95,0XB4,0X96,0XA5,0X96,0X97,0X78,0X79,0X78,0X69,0X78,0X77,//1950 0X96,0XB4,0X96,0XA6,0X97,0X97,0X79,0X79,0X79,0X69,0X78,0X78,//1951 0X96,0XA5,0XA6,0XA5,0XA6,0X96,0X88,0X88,0X78,0X78,0X87,0X87,//1952 0XA5,0XB4,0X96,0XA5,0X96,0X97,0X88,0X78,0X78,0X79,0X77,0X87,//1953 0X95,0XB4,0X96,0XA5,0X96,0X97,0X78,0X79,0X78,0X68,0X78,0X87,//1954 0X96,0XB4,0X96,0XA6,0X97,0X97,0X78,0X79,0X79,0X69,0X78,0X77,//1955 0X96,0XA5,0XA5,0XA5,0XA6,0X96,0X88,0X88,0X78,0X78,0X87,0X87,//1956 0XA5,0XB4,0X96,0XA5,0X96,0X97,0X88,0X78,0X78,0X79,0X77,0X87,//1957 0X95,0XB4,0X96,0XA5,0X96,0X97,0X88,0X78,0X78,0X69,0X78,0X87,//1958 0X96,0XB4,0X96,0XA6,0X97,0X97,0X78,0X79,0X79,0X69,0X78,0X77,//1959 0X96,0XA4,0XA5,0XA5,0XA6,0X96,0X88,0X88,0X88,0X78,0X87,0X87,//1960 0XA5,0XB4,0X96,0XA5,0X96,0X96,0X88,0X78,0X78,0X78,0X87,0X87,//1961 0X96,0XB4,0X96,0XA5,0X96,0X97,0X88,0X78,0X78,0X69,0X78,0X87,//1962 0X96,0XB4,0X96,0XA6,0X97,0X97,0X78,0X79,0X79,0X69,0X78,0X77,//1963 0X96,0XA4,0XA5,0XA5,0XA6,0X96,0X88,0X88,0X88,0X78,0X87,0X87,//1964 0XA5,0XB4,0X96,0XA5,0X96,0X96,0X88,0X78,0X78,0X78,0X87,0X87,//1965 0X95,0XB4,0X96,0XA5,0X96,0X97,0X88,0X78,0X78,0X69,0X78,0X87,//1966 0X96,0XB4,0X96,0XA6,0X97,0X97,0X78,0X79,0X79,0X69,0X78,0X77,//1967 0X96,0XA4,0XA5,0XA5,0XA6,0XA6,0X88,0X88,0X88,0X78,0X87,0X87,//1968 0XA5,0XB4,0X96,0XA5,0X96,0X96,0X88,0X78,0X78,0X78,0X87,0X87,//1969 0X95,0XB4,0X96,0XA5,0X96,0X97,0X88,0X78,0X78,0X69,0X78,0X87,//1970 0X96,0XB4,0X96,0XA6,0X97,0X97,0X78,0X79,0X79,0X69,0X78,0X77,//1971 0X96,0XA4,0XA5,0XA5,0XA6,0XA6,0X88,0X88,0X88,0X78,0X87,0X87,//1972 0XA5,0XB5,0X96,0XA5,0XA6,0X96,0X88,0X78,0X78,0X78,0X87,0X87,//1973 0X95,0XB4,0X96,0XA5,0X96,0X97,0X88,0X78,0X78,0X69,0X78,0X87,//1974 0X96,0XB4,0X96,0XA6,0X97,0X97,0X78,0X79,0X78,0X69,0X78,0X77,//1975 0X96,0XA4,0XA5,0XB5,0XA6,0XA6,0X88,0X89,0X88,0X78,0X87,0X87,//1976 0XA5,0XB4,0X96,0XA5,0X96,0X96,0X88,0X88,0X78,0X78,0X87,0X87,//1977 0X95,0XB4,0X96,0XA5,0X96,0X97,0X88,0X78,0X78,0X79,0X78,0X87,//1978 0X96,0XB4,0X96,0XA6,0X96,0X97,0X78,0X79,0X78,0X69,0X78,0X77,//1979 0X96,0XA4,0XA5,0XB5,0XA6,0XA6,0X88,0X88,0X88,0X78,0X87,0X87,//1980 0XA5,0XB4,0X96,0XA5,0XA6,0X96,0X88,0X88,0X78,0X78,0X77,0X87,//1981 0X95,0XB4,0X96,0XA5,0X96,0X97,0X88,0X78,0X78,0X79,0X77,0X87,//1982 0X95,0XB4,0X96,0XA5,0X96,0X97,0X78,0X79,0X78,0X69,0X78,0X77,//1983 0X96,0XB4,0XA5,0XB5,0XA6,0XA6,0X87,0X88,0X88,0X78,0X87,0X87,//1984 0XA5,0XB4,0XA6,0XA5,0XA6,0X96,0X88,0X88,0X78,0X78,0X87,0X87,//1985 0XA5,0XB4,0X96,0XA5,0X96,0X97,0X88,0X78,0X78,0X79,0X77,0X87,//1986 0X95,0XB4,0X96,0XA5,0X96,0X97,0X88,0X79,0X78,0X69,0X78,0X87,//1987 0X96,0XB4,0XA5,0XB5,0XA6,0XA6,0X87,0X88,0X88,0X78,0X87,0X86,//1988 0XA5,0XB4,0XA5,0XA5,0XA6,0X96,0X88,0X88,0X88,0X78,0X87,0X87,//1989 0XA5,0XB4,0X96,0XA5,0X96,0X96,0X88,0X78,0X78,0X79,0X77,0X87,//1990 0X95,0XB4,0X96,0XA5,0X86,0X97,0X88,0X78,0X78,0X69,0X78,0X87,//1991 0X96,0XB4,0XA5,0XB5,0XA6,0XA6,0X87,0X88,0X88,0X78,0X87,0X86,//1992 0XA5,0XB3,0XA5,0XA5,0XA6,0X96,0X88,0X88,0X88,0X78,0X87,0X87,//1993 0XA5,0XB4,0X96,0XA5,0X96,0X96,0X88,0X78,0X78,0X78,0X87,0X87,//1994 0X95,0XB4,0X96,0XA5,0X96,0X97,0X88,0X76,0X78,0X69,0X78,0X87,//1995 0X96,0XB4,0XA5,0XB5,0XA6,0XA6,0X87,0X88,0X88,0X78,0X87,0X86,//1996 0XA5,0XB3,0XA5,0XA5,0XA6,0XA6,0X88,0X88,0X88,0X78,0X87,0X87,//1997 0XA5,0XB4,0X96,0XA5,0X96,0X96,0X88,0X78,0X78,0X78,0X87,0X87,//1998 0X95,0XB4,0X96,0XA5,0X96,0X97,0X88,0X78,0X78,0X69,0X78,0X87,//1999 0X96,0XB4,0XA5,0XB5,0XA6,0XA6,0X87,0X88,0X88,0X78,0X87,0X86,//2000 0XA5,0XB3,0XA5,0XA5,0XA6,0XA6,0X88,0X88,0X88,0X78,0X87,0X87,//2001 0XA5,0XB4,0X96,0XA5,0X96,0X96,0X88,0X78,0X78,0X78,0X87,0X87,//2002 0X95,0XB4,0X96,0XA5,0X96,0X97,0X88,0X78,0X78,0X69,0X78,0X87,// 0X96,0XB4,0XA5,0XB5,0XA6,0XA6,0X87,0X88,0X88,0X78,0X87,0X86,// 0XA5,0XB3,0XA5,0XA5,0XA6,0XA6,0X88,0X88,0X88,0X78,0X87,0X87,// 0XA5,0XB4,0X96,0XA5,0XA6,0X96,0X88,0X88,0X78,0X78,0X87,0X87,// 0X95,0XB4,0X96,0XA5,0X96,0X97,0X88,0X78,0X78,0X69,0X78,0X87,// 0X96,0XB4,0XA5,0XB5,0XA6,0XA6,0X87,0X88,0X87,0X78,0X87,0X86,// 0XA5,0XB3,0XA5,0XB5,0XA6,0XA6,0X88,0X88,0X88,0X78,0X87,0X87,// 0XA5,0XB4,0X96,0XA5,0XA6,0X96,0X88,0X88,0X78,0X78,0X87,0X87,// 0X95,0XB4,0X96,0XA5,0X96,0X97,0X88,0X78,0X78,0X79,0X78,0X87,// 0X96,0XB4,0XA5,0XB5,0XA5,0XA6,0X87,0X88,0X87,0X78,0X87,0X86,// 0XA5,0XB3,0XA5,0XB5,0XA6,0XA6,0X87,0X88,0X88,0X78,0X87,0X87,// 0XA5,0XB4,0X96,0XA5,0XA6,0X96,0X88,0X88,0X78,0X78,0X87,0X87,// 0X95,0XB4,0X96,0XA5,0X96,0X97,0X88,0X78,0X78,0X79,0X77,0X87,// 0X95,0XB4,0XA5,0XB4,0XA5,0XA6,0X87,0X88,0X87,0X78,0X87,0X86,// 0XA5,0XC3,0XA5,0XB5,0XA6,0XA6,0X87,0X88,0X88,0X78,0X87,0X87,// 0XA5,0XB4,0XA6,0XA5,0XA6,0X96,0X88,0X88,0X78,0X78,0X87,0X87,// 0XA5,0XB4,0X96,0XA5,0X96,0X96,0X88,0X78,0X78,0X79,0X77,0X87,// 0X95,0XB4,0XA5,0XB4,0XA5,0XA6,0X97,0X87,0X87,0X78,0X87,0X86,// 0XA5,0XC3,0XA5,0XB5,0XA6,0XA6,0X87,0X88,0X88,0X78,0X87,0X86,// 0XA5,0XB4,0XA5,0XA5,0XA6,0X96,0X88,0X88,0X88,0X78,0X87,0X87,// 0XA5,0XB4,0X96,0XA5,0X96,0X96,0X88,0X78,0X78,0X79,0X77,0X87,// 0X95,0XB4,0XA5,0XB4,0XA5,0XA6,0X97,0X87,0X87,0X78,0X87,0X96,//2024 0XA5,0XC3,0XA5,0XB5,0XA6,0XA6,0X87,0X88,0X88,0X78,0X87,0X86,//2025 0XA5,0XB3,0XA5,0XA5,0XA6,0XA6,0X88,0X88,0X88,0X78,0X87,0X87,//2026 0XA5,0XB4,0X96,0XA5,0X96,0X96,0X88,0X78,0X78,0X78,0X87,0X87,//2027 0X95,0XB4,0XA5,0XB4,0XA5,0XA6,0X97,0X87,0X87,0X78,0X87,0X96,//2028 0XA5,0XC3,0XA5,0XB5,0XA6,0XA6,0X87,0X88,0X88,0X78,0X87,0X86,//2029 0XA5,0XB3,0XA5,0XA5,0XA6,0XA6,0X88,0X88,0X88,0X78,0X87,0X87,//2030 0XA5,0XB4,0X96,0XA5,0X96,0X96,0X88,0X78,0X78,0X78,0X87,0X87,//2031 0X95,0XB4,0XA5,0XB4,0XA5,0XA6,0X97,0X87,0X87,0X78,0X87,0X96,//2032 0XA5,0XC3,0XA5,0XB5,0XA6,0XA6,0X88,0X88,0X88,0X78,0X87,0X86,//2033 0XA5,0XB3,0XA5,0XA5,0XA6,0XA6,0X88,0X78,0X88,0X78,0X87,0X87,//2034 0XA5,0XB4,0X96,0XA5,0XA6,0X96,0X88,0X88,0X78,0X78,0X87,0X87,//2035 0X95,0XB4,0XA5,0XB4,0XA5,0XA6,0X97,0X87,0X87,0X78,0X87,0X96,//2036 0XA5,0XC3,0XA5,0XB5,0XA6,0XA6,0X87,0X88,0X88,0X78,0X87,0X86,//2037 0XA5,0XB3,0XA5,0XA5,0XA6,0XA6,0X88,0X88,0X88,0X78,0X87,0X87,//2038 0XA5,0XB4,0X96,0XA5,0XA6,0X96,0X88,0X88,0X78,0X78,0X87,0X87,//2039 0X95,0XB4,0XA5,0XB4,0XA5,0XA6,0X97,0X87,0X87,0X78,0X87,0X96,//2040 0XA5,0XC3,0XA5,0XB5,0XA5,0XA6,0X87,0X88,0X87,0X78,0X87,0X86,//2041 0XA5,0XB3,0XA5,0XB5,0XA6,0XA6,0X88,0X88,0X88,0X78,0X87,0X87,//2042 0XA5,0XB4,0X96,0XA5,0XA6,0X96,0X88,0X88,0X78,0X78,0X87,0X87,//2043 0X95,0XB4,0XA5,0XB4,0XA5,0XA6,0X97,0X87,0X87,0X88,0X87,0X96,//2044 0XA5,0XC3,0XA5,0XB4,0XA5,0XA6,0X87,0X88,0X87,0X78,0X87,0X86,//2045 0XA5,0XB3,0XA5,0XB5,0XA6,0XA6,0X87,0X88,0X88,0X78,0X87,0X87,//2046 0XA5,0XB4,0X96,0XA5,0XA6,0X96,0X88,0X88,0X78,0X78,0X87,0X87,//2047 0X95,0XB4,0XA5,0XB4,0XA5,0XA5,0X97,0X87,0X87,0X88,0X86,0X96,//2048 0XA4,0XC3,0XA5,0XA5,0XA5,0XA6,0X97,0X87,0X87,0X78,0X87,0X86,//2049 0XA5,0XC3,0XA5,0XB5,0XA6,0XA6,0X87,0X88,0X78,0X78,0X87,0X87//2050 };

(感谢baickl)

七、C语言(1):

前段时间做软件写了个公历转农历的函数,目前公开给大家参考,有兴趣的朋友可以在此基础上进一步完善其功能。

/*------------农历转换函数-----------*/char*GetDayOf(PSYSTEMTIMEpSt){/*天干名称*/constchar*cTianGan[]={"甲","乙","丙","丁","戊","己","庚","辛","壬","癸"};/*地支名称*/constchar*cDiZhi[]={"子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"};/*属相名称*/constchar*cShuXiang[]={"鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪"};/*农历日期名*/constchar*cDayName[]={"*","初一","初二","初三","初四","初五","初六","初七","初八","初九","初十","十一","十二","十三","十四","十五","十六","十七","十八","十九","二十","廿一","廿二","廿三","廿四","廿五","廿六","廿七","廿八","廿九","三十"};/*农历月份名*/constchar*cMonName[]={"*","正","二","三","四","五","六","七","八","九","十","十一","腊"};/*公历每月前面的天数*/constintwMonthAdd[12]={0,31,59,90,120,151,181,212,243,273,304,334};/*农历数据*/constintwNongliData[100]={2635,333387,1701,1748,267701,694,2391,133423,1175,396438,3402,3749,331177,1453,694,26,2350,465197,3221,3402,400202,2901,1386,267611,605,2349,137515,2709,464533,1738,2901,330421,1242,2651,199255,1323,529706,3733,1706,398762,2741,1206,267438,2647,1318,204070,3477,461653,1386,2413,330077,1197,2637,268877,3365,531109,2900,2922,398042,2395,1179,267415,2635,661067,1701,1748,398772,2742,2391,330031,1175,1611,200010,3749,527717,1452,2742,332397,2350,3222,268949,3402,3493,133973,1386,464219,605,2349,334123,2709,2890,267946,2773,592565,1210,2651,395863,1323,2707,265877};staticintwCurYear,wCurMonth,wCurDay;staticintnTheDate,nIsEnd,m,k,n,i,nBit;TCHARszNongli[30],szNongliDay[10],szShuXiang[10];/*---取当前公历年、月、日---*/wCurYear=pSt->wYear;wCurMonth=pSt->wMonth;wCurDay=pSt->wDay;/*---计算到初始时间192月8日的天数:1921-2-8(正月初一)---*/nTheDate=(wCurYear-1921)*365+(wCurYear-1921)/4+wCurDay+wMonthAdd[wCurMonth-1]-38;if((!(wCurYear%4))&&(wCurMonth>2))nTheDate=nTheDate+1;/*--计算农历天干、地支、月、日---*/nIsEnd=0;m=0;while(nIsEnd!=1){if(wNongliData[m]<4095)k=11;elsek=12;n=k;while(n>=0){//获取wNongliData(m)的第n个二进制位的值 nBit=wNongliData[m];for(i=1;i<n+1;i++)nBit=nBit/2;nBit=nBit%2;if(nTheDate<=(29+nBit)){nIsEnd=1;break;}nTheDate=nTheDate-29-nBit;n=n-1;}if(nIsEnd)break;m=m+1;}wCurYear=1921+m;wCurMonth=k-n+1;wCurDay=nTheDate;if(k==12){if(wCurMonth==wNongliData[m]/65536+1)wCurMonth=1-wCurMonth;elseif(wCurMonth>wNongliData[m]/65536+1)wCurMonth=wCurMonth-1;}/*--生成农历天干、地支、属相==>wNongli--*/wsprintf(szShuXiang,"%s",cShuXiang[((wCurYear-4)%60)%12]);wsprintf(szNongli,"%s(%s%s)年",szShuXiang,cTianGan[((wCurYear-4)%60)%10],cDiZhi[((wCurYear-4)%60)%12]);/*--生成农历月、日==>wNongliDay--*/if(wCurMonth<1)wsprintf(szNongliDay,"闰%s",cMonName[-1*wCurMonth]);elsestrcpy(szNongliDay,cMonName[wCurMonth]);strcat(szNongliDay,"月");strcat(szNongliDay,cDayName[wCurDay]);returnstrcat(szNongli,szNongliDay);}

(感谢CSDN作者3661512)

八、C语言(2):

/*prototype:intcalconv(structconvdate*);structconvdate{intsource;==0则输入日期为西历,!=0则输入为农历intsolaryear;输出或输入之西历年份intsolarmonth;西历月intsolardate;西历日intlunaryear;输出或输入之农历年份intlunarmonth;农历月intlunardate;农历日intweekday;该日为星期几(0==星期日,1==星期一,...)intkan;该日天干(0==甲,1==乙,...,9==癸)intchih;该日地支(0==子,1==丑,...,11==亥)};呼叫时须设定souce的值,若为0则为西历转农历,否则为农历转西历.然後视输入为西历或农历来设定西历或农历的年月日.转换後的年月日会填入结构中(农历或西历),以及该日为星期几,天干地支.若函式的返回值为0表示没有错误,1为输入之年份错误,2为输入之月份错误,3为输入之日期错误.输入之西历年须在1937-2031间输入之农历年须在1936-2030间若须扩充,则增加lunarcal[]*/#definefirstyear1936/*thefirstyearinlunarcal[]*/ structconvdate{intsource;intsolaryear;intsolarmonth;intsolardate;intlunaryear;intlunarmonth;intlunardate;intweekday;intkan;intchih;};structtaglunarcal{intbasedays;/*到西历1月1日到农历正月初一的累积日数*/intintercalation;/*闰月月份.0==此年没有闰月*/intbaseweekday;/*此年西历1月1日为星期几再减1*/intbasekanchih;/*此年西历1月1日之干支序号减1*/intmonthdays[13];/*此农历年每月之大小,0==小月(29日),1==大月(30日)*/};structtaglunarcallunarcal[]={{23,3,2,17,1,0,0,1,0,0,1,1,0,1,1,1,0},/*1936*/{41,0,4,23,1,0,0,1,0,0,1,0,1,1,1,0,1},{30,7,5,28,1,1,0,0,1,0,0,1,0,1,1,0,1},{49,0,6,33,1,1,0,0,1,0,0,1,0,1,0,1,1},{38,0,0,38,1,1,0,1,0,1,0,0,1,0,1,0,1},/*1940*/{26,6,2,44,1,1,0,1,1,0,1,0,0,1,0,1,0},{45,0,3,49,1,0,1,1,0,1,0,1,0,1,0,1,0},{35,0,4,54,0,1,0,1,0,1,1,0,1,0,1,0,1},{24,4,5,59,1,0,1,0,1,0,1,0,1,1,0,1,1},/*1944*/{43,0,0,5,0,0,1,0,0,1,0,1,1,1,0,1,1},{32,0,1,10,1,0,0,1,0,0,1,0,1,1,0,1,1},{21,2,2,15,1,1,0,0,1,0,0,1,0,1,0,1,1},{40,0,3,20,1,0,1,0,1,0,0,1,0,1,0,1,1},/*1948*/{28,7,5,26,1,0,1,1,0,1,0,0,1,0,1,0,1},{47,0,6,31,0,1,1,0,1,1,0,0,1,0,1,0,1},{36,0,0,36,1,0,1,1,0,1,0,1,0,1,0,1,0},{26,5,1,41,0,1,0,1,0,1,0,1,1,0,1,0,1},/*1952*/{44,0,3,47,0,1,0,0,1,1,0,1,1,0,1,0,1},{33,0,4,52,1,0,1,0,0,1,0,1,1,0,1,1,0},{23,3,5,57,0,1,0,1,0,0,1,0,1,0,1,1,1},{42,0,6,2,0,1,0,1,0,0,1,0,1,0,1,1,1},/*1956*/{30,8,1,8,1,0,1,0,1,0,0,1,0,1,0,1,0},{48,0,2,13,1,1,1,0,1,0,0,1,0,1,0,1,0},{38,0,3,18,0,1,1,0,1,0,1,0,1,0,1,0,1},{27,6,4,23,1,0,1,0,1,1,0,1,0,1,0,1,0},/*1960*/{45,0,6,29,1,0,1,0,1,0,1,1,0,1,0,1,0},{35,0,0,34,0,1,0,0,1,0,1,1,0,1,1,0,1},{24,4,1,39,1,0,1,0,0,1,0,1,0,1,1,1,0},{43,0,2,44,1,0,1,0,0,1,0,1,0,1,1,1,0},/*1964*/{32,0,4,50,0,1,0,1,0,0,1,0,0,1,1,0,1},{20,3,5,55,1,1,1,0,1,0,0,1,0,0,1,1,0},{39,0,6,0,1,1,0,1,1,0,0,1,0,1,0,1,0},{29,7,0,5,0,1,0,1,1,0,1,0,1,0,1,0,1},/*1968*/{47,0,2,11,0,1,0,1,0,1,1,0,1,0,1,0,1},{36,0,3,16,1,0,0,1,0,1,1,0,1,1,0,1,0},{26,5,4,21,0,1,0,0,1,0,1,0,1,1,1,0,1},{45,0,5,26,0,1,0,0,1,0,1,0,1,1,0,1,1},/*1972*/{33,0,0,32,1,0,1,0,0,1,0,0,1,1,0,1,1},{22,4,1,37,1,1,0,1,0,0,1,0,0,1,1,0,1},{41,0,2,42,1,1,0,1,0,0,1,0,0,1,0,1,1},{30,8,3,47,1,1,0,1,0,1,0,1,0,0,1,0,1},/*1976*/{48,0,5,53,1,0,1,1,0,1,0,1,0,1,0,0,1},{37,0,6,58,1,0,1,1,0,1,1,0,1,0,1,0,1},{27,6,0,3,1,0,0,1,0,1,1,0,1,1,0,1,0},{46,0,1,8,1,0,0,1,0,1,0,1,1,0,1,1,0},/*1980*/{35,0,3,14,0,1,0,0,1,0,0,1,1,0,1,1,1},{24,4,4,19,1,0,1,0,0,1,0,0,1,0,1,1,1},{43,0,5,24,1,0,1,0,0,1,0,0,1,0,1,1,1},{32,10,6,29,1,0,1,1,0,0,1,0,0,1,0,1,1},/*1984*/{50,0,1,35,0,1,1,0,1,0,1,0,0,1,0,1,0},{39,0,2,40,0,1,1,0,1,1,0,1,0,1,0,0,1},{28,6,3,45,1,0,1,0,1,1,0,1,1,0,1,0,0},{47,0,4,50,1,0,1,0,1,0,1,1,0,1,1,0,1},/*1988*/{36,0,6,56,1,0,0,1,0,0,1,1,0,1,1,1,0},{26,5,0,1,0,1,0,0,1,0,0,1,0,1,1,1,1},{45,0,1,6,0,1,0,0,1,0,0,1,0,1,1,1,0},{34,0,2,11,0,1,1,0,0,1,0,0,1,0,1,1,0},/*1992*/{22,3,4,17,0,1,1,0,1,0,1,0,0,1,0,1,0},{40,0,5,22,1,1,1,0,1,0,1,0,0,1,0,1,0},{30,8,6,27,0,1,1,0,1,0,1,1,0,0,1,0,1},{49,0,0,32,0,1,0,1,1,0,1,0,1,1,0,0,1},/*1996*/{37,0,2,38,1,0,1,0,1,0,1,1,0,1,1,0,1},{27,5,3,43,1,0,0,1,0,0,1,1,0,1,1,0,1},{46,0,4,48,1,0,0,1,0,0,1,0,1,1,1,0,1},{35,0,5,53,1,1,0,0,1,0,0,1,0,1,1,0,1},/*2000*/{23,4,0,59,1,1,0,1,0,1,0,0,1,0,1,0,1},{42,0,1,4,1,1,0,1,0,1,0,0,1,0,1,0,1},{31,0,2,9,1,1,0,1,1,0,1,0,0,1,0,1,0},{21,2,3,14,0,1,0,1,1,0,1,0,1,0,1,0,1},/**/{39,0,5,20,0,1,0,1,0,1,1,0,1,0,1,0,1},{28,7,6,25,1,0,1,0,1,0,1,0,1,1,0,1,1},{48,0,0,30,0,0,1,0,0,1,0,1,1,1,0,1,1},{37,0,1,35,1,0,0,1,0,0,1,0,1,1,0,1,1},/**/{25,5,3,41,1,1,0,0,1,0,0,1,0,1,0,1,1},{44,0,4,46,1,0,1,0,1,0,0,1,0,1,0,1,1},{33,0,5,51,1,0,1,1,0,1,0,0,1,0,1,0,1},{22,4,6,56,1,0,1,1,0,1,0,1,0,1,0,1,0},/**/{40,0,1,2,1,0,1,1,0,1,0,1,0,1,0,1,0},{30,9,2,7,0,1,0,1,0,1,0,1,1,0,1,0,1},{49,0,3,12,0,1,0,0,1,0,1,1,1,0,1,0,1},{38,0,4,17,1,0,1,0,0,1,0,1,1,0,1,1,0},/**/{27,6,6,23,0,1,0,1,0,0,1,0,1,0,1,1,1},{46,0,0,28,0,1,0,1,0,0,1,0,1,0,1,1,0},{35,0,1,33,0,1,1,0,1,0,0,1,0,0,1,1,0},{24,4,2,38,0,1,1,1,0,1,0,0,1,0,1,0,1},/**/{42,0,4,44,0,1,1,0,1,0,1,0,1,0,1,0,1},{31,0,5,49,1,0,1,0,1,1,0,1,0,1,0,1,0},{21,2,6,54,0,1,0,1,0,1,0,1,1,0,1,0,1},{40,0,0,59,0,1,0,0,1,0,1,1,0,1,1,0,1},/*2024*/{28,6,2,5,1,0,1,0,0,1,0,1,0,1,1,1,0},{47,0,3,10,1,0,1,0,0,1,0,0,1,1,1,0,1},{36,0,4,15,1,1,0,1,0,0,1,0,0,1,1,0,1},{25,5,5,20,1,1,1,0,1,0,0,1,0,0,1,1,0},/*2028*/{43,0,0,26,1,1,0,1,0,1,0,1,0,0,1,0,1},{32,0,1,31,1,1,0,1,1,0,1,0,1,0,1,0,0},{22,3,2,36,0,1,1,0,1,0,1,1,0,1,0,1,0}};#definelastyear(firstyear+sizeof(lunarcal)/sizeof(structtaglunarcal)-1) /*西历年每月之日数*/intsolarcal[12]={31,28,31,30,31,30,31,31,30,31,30,31};/*西历年每月之累积日数,平年与闰年*/intsolardays[2][14]={{0,31,59,90,120,151,181,212,243,273,304,334,365,396},{0,31,60,91,121,152,182,213,244,274,305,335,366,397}};/*求此西历年是否为闰年,返回0为平年,1为闰年*/intgetleap(intyear){if(year%400==0)return1;elseif(year%100==0)return0;elseif(year%4==0)return1;elsereturn0;}/*西历农历转换*/intcalconv(structconvdate*cd){intleap,d,sm,y,im,l1,l2,acc,i,lm,kc;if(cd->source==0)/*solar*/{if(cd->solaryear<=firstyear||cd->solaryear>lastyear)return1;sm=cd->solarmonth-1;if(sm<0||sm>11)return2;leap=getleap(cd->solaryear);if(sm==1)d=leap+28;elsed=solarcal[sm];if(cd->solardate<1||cd->solardate>d)return3;y=cd->solaryear-firstyear;acc=solardays[leap][sm]+cd->solardate;cd->weekday=(acc+lunarcal[y].baseweekday)%7;kc=acc+lunarcal[y].basekanchih;cd->kan=kc%10;cd->chih=kc%12;if(acc<=lunarcal[y].basedays){y--;cd->lunaryear=cd->solaryear-1;leap=getleap(cd->lunaryear);sm+=12;acc=solardays[leap][sm]+cd->solardate;}elsecd->lunaryear=cd->solaryear;l1=lunarcal[y].basedays;for(i=0;i<13;i++){l2=l1+lunarcal[y].monthdays[i]+29;if(acc<=l2)break;l1=l2;}cd->lunarmonth=i+1;cd->lunardate=acc-l1;im=lunarcal[y].intercalation;if(im!=0&&cd->lunarmonth>im){cd->lunarmonth--;if(cd->lunarmonth==im)cd->lunarmonth=-im;}if(cd->lunarmonth>12)cd->lunarmonth-=12;}else/*lunar*/{if(cd->lunaryear<firstyear||cd->lunaryear>=lastyear)return1;y=cd->lunaryear-firstyear;im=lunarcal[y].intercalation;lm=cd->lunarmonth;if(lm<0){if(lm!=-im)return2;}elseif(lm<1||lm>12)return2;if(im!=0){if(lm>im)lm++;elseif(lm==-im)lm=im+1;}lm--;if(cd->lunardate>lunarcal[y].monthdays[lm]+29)return3;acc=lunarcal[y].basedays;for(i=0;iacc+=lunarcal[y].monthdays[i]+29;acc+=cd->lunardate;leap=getleap(cd->lunaryear);for(i=13;i>=0;i--)if(acc>solardays[leap][i])break;cd->solardate=acc-solardays[leap][i];if(i<=11){cd->solaryear=cd->lunaryear;cd->solarmonth=i+1;}else{cd->solaryear=cd->lunaryear+1;cd->solarmonth=i-11;}leap=getleap(cd->solaryear);y=cd->solaryear-firstyear;acc=solardays[leap][cd->solarmonth-1]+cd->solardate;cd->weekday=(acc+lunarcal[y].baseweekday)%7;kc=acc+lunarcal[y].basekanchih;cd->kan=kc%10;cd->chih=kc%12;}return0;}

(感谢各位作者)

文献:

1、/09/25175/25175_html/-11/936.html

2、/wangleiit/blog/item/d2ef51088122bf910b7b827c.html

3、/ArticleDisp.asp?ID=4618

4、/panjiwen/archive//02/06/326159.html

5、/taoshaw/article.asp?id=1494

6、/Dotnet/C/208963.html

7、/gaokao_news.do?infoID=50354

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。