C++实现带中国农历的万年历(支持C/C#)

编程入门 行业动态 更新时间:2024-10-20 05:28:51

C++实现带中国农历的<a href=https://www.elefans.com/category/jswz/34/1766894.html style=万年历(支持C/C#)"/>

C++实现带中国农历的万年历(支持C/C#)

忙里偷闲,这几天写了个万年历,是win32控制台的,效果还不错,先放上效果图:

做得丑了些,多年以前,看过多数万年历软件的代码,感觉需要将一些有共性的东西组织起来,免得重复造轮子,于是,本人打算将这部分内容封装成库,libLunar就这样诞生了。它是一个Windows下,C++接口的动态链接库,提供了丰富的方法来实现日期转换。经过多年的努力,目前已经比较完美。

头文件中定义的结构体如下:

typedef enum eConstellationName
{Co_InitValue = 0,//初始化值(无实际意义),请注意和数组下标匹配Co_Capricorn,//摩羯座Co_Aquarius,//水瓶座Co_Pisces,//双鱼座Co_Aries,//白羊座Co_Taurus,//金牛座Co_Gemini,//双子座Co_Cancer,//巨蟹座Co_Leo,//狮子座Co_Virgo,//处女座Co_Libra,//天秤座Co_Scorpio,//天蝎座Co_Sagittarius,//射手座Co_End	//结束(无效类型,特殊用处)
}ConstellationName;//星座typedef enum eHolidayName
{Hn_EasterSunday, //复活节(easter sunday)Hn_MothersDay, //母亲节(mother's day)Hn_FathersDay, //父亲节(father's day)Hn_ThanksgivingDay, //感恩节(thanksgiving day)Hn_ChunShe, //春社日(spring commune day)Hn_QiuShe, //秋社日(Autumn commune day)Hn_YiJiu, //一九(此日期在公历的上一年,即冬至日)Hn_ErJiu, //二九(此日期也在公历的上一年)Hn_SanJiu, //三九Hn_SiJiu, //四九Hn_WuJiu, //五九Hn_LiuJiu, //六九Hn_QiJiu, //七九Hn_BaJiu, //八九Hn_JiuJiu, //九九Hn_RuMei, //入梅Hn_ChuMei, //出梅Hn_ChuFu, //初伏Hn_ZhongFu, //中伏Hn_MoFu, //末伏Hn_Count
}HolidayName;typedef enum eLunarPhaseName
{Lp_InitValue = 0,//初始化值(无实际意义),请注意和数组下标匹配Lp_NewMoon,//新月Lp_FirstQuarter,//上弦Lp_FullMoon,//满月Lp_LastQuarter,//下弦Lp_End	//结束(无效类型,特殊用处)
}LunarPhaseName;//月相typedef enum eSolarTermName
{St_InitValue = 0,//初始化值(无实际意义),请注意和数组下标匹配St_LiChun,//立春St_YuShui,//雨水St_JingZhe,//惊蛰St_ChunFen,//春分St_QingMing,//清明St_GuYu,//谷雨St_LiXia,//立夏St_XiaoMan,//小满St_MangZhong,//芒种St_XiaZhi,//夏至St_XiaoShu,//小暑St_DaShu,//大暑St_LiQiu,//立秋St_ChuShu,//处暑St_BaiLu,//白露St_QiuFen,//秋分St_HanLu,//寒露St_ShuangJiang,//霜降St_LiDong,//立冬St_XiaoXue,//小雪St_DaXue,//大雪St_DongZhi,//冬至St_XiaoHan,//小寒St_DaHan,//大寒St_End	//结束(无效类型,特殊用处)
}SolarTermName;//节气typedef enum ePhenologyName
{Ph_InitValue = 0,Ph_DongFengJieDong,//东风解冻Ph_ZheChongShiZhen,//蛰虫始振Ph_YuZhiFuBing,//鱼陟负冰Ph_TaJiYu,//獭祭鱼Ph_HouYanBei,//候雁北Ph_CaoMuMengDang,//草木萌动Ph_TaoShiHua,//桃始华Ph_CangGengMing,//仓庚鸣Ph_YingHuaWeiJiu,//鹰化为鸠Ph_XuanNiaoZhi,//玄鸟至Ph_LeiNaiFaSheng,//雷乃发声Ph_ShiDian,//始电Ph_TongShiHua,//桐始华Ph_TianShuHuaRu,//田鼠化鴽Ph_HongShiJian,//虹始见Ph_PingShiSheng,//萍始生Ph_MingJiuFuYu,//鸣鸠拂羽Ph_DaiShengJiangSang,//戴胜降桑Ph_LouGuoMing,//蝼蝈鸣Ph_QiuYinChu,//蚯蚓出Ph_WangGuaSheng,//王瓜生Ph_KuCaiXiu,//苦菜秀Ph_MiCaoSi,//靡草死Ph_MaiQiuZhi,//麦秋至Ph_TangLangSheng,//螳螂生Ph_JuanShiMing,//鹃始鸣Ph_FanSheWuSheng,//反舌无声Ph_LuJiaoJie,//鹿角解Ph_TiaoShiMing,//蜩始鸣Ph_BanXiaSheng,//半夏生Ph_WenFengZhi,//温风至Ph_XiFengJuBi,//蟋蜂居壁Ph_YingShiZhi,//鹰始挚Ph_FuCaoWeiYing,//腐草为萤Ph_TuRunRuShu,//土润溽暑Ph_DaYuShiXing,//大雨时行Ph_LiangFengZhi,//凉风至Ph_BaiLuJiang,//白露降Ph_HanChanMing,//寒蝉鸣Ph_YingNaiJiNiao,//鹰乃祭鸟Ph_TianDiShiSu,//天地始肃Ph_HeNaiDeng,//禾乃登Ph_HongYanLai,//鸿雁来Ph_XuanNiaoGui,//玄鸟归Ph_QunNiaoYangXiu,//群鸟养羞Ph_LeiShiShouSheng,//雷始收声Ph_ZheChongPiHu,//蛰虫坯户Ph_ShuiShiHe,//水始涸Ph_HongYanLaiBin,//鸿雁来宾Ph_QueRuDaShuiWeiGe,//雀入大水为蛤Ph_JuYouHuangHua,//菊有黄华Ph_ChaiNaiJiShou,//豺乃祭兽Ph_CaoMuHuangLuo,//草木黄落Ph_ZheChongXianFu,//蛰虫咸俯Ph_ShuiShiBing,//水始冰Ph_DiShiDong,//地始冻Ph_ZhiRuDaShuiWeiShen,//雉入大水为蜃Ph_HongCangBuJian,//虹藏不见Ph_TianQiShangSheng,//天气上升Ph_BiSeChengDong,//闭塞成冬Ph_HeDanBuMing,//鹖鴠不鸣Ph_HuShiJIao,//虎始交Ph_LiTingChu,//荔挺出Ph_QiuYinJie,//蚯蚓结Ph_JunJiaoJie,//麋角解Ph_ShuiQuanDong,//水泉动Ph_YanBeiXiang,//雁北乡Ph_QueShiChao,//鹊始巢Ph_ZhiGou,//雉雊Ph_JiRu,//鸡乳Ph_ZhengNiaoLiJi,//征鸟厉疾Ph_ShuiZeFuJian,//水泽腹坚Ph_End	//结束
}PhenologyName;//物候typedef enum eMonthName
{Mn_InitValue = 0,//初始值Mn_January,//1月Mn_February,//2月Mn_March,//3月Mn_April,//4月Mn_May,//5月Mn_June,//6月Mn_July,//7月Mn_August,//8月Mn_September,//9月Mn_October,//10月Mn_November,//11月Mn_December,//12月Mn_End	//结束
}MonthName;typedef enum eDayOfWeek
{Dw_Sunday = 0,//星期日Dw_Monday,//星期一Dw_Tuesday,//星期二Dw_Wednesday,//星期三Dw_Thursday,//星期四Dw_FriDay,//星期五Dw_Saturday//星期六
}DayOfWeek;typedef enum eMonthType
{Mt_Normal = 0,//正常Mt_Later,//后Mt_Alias,//异名Mt_Extra,//附加Mt_Second,//第二个Mt_Last//上一个
}MonthType;//月份类型typedef struct tagYEAR
{union{UINT uData;struct{UINT wYear:31;//公历年份编号UINT bBeforeChrist:1;//是否为公元前};};
}YEAR, *PYEAR, LPYEAR;//年份typedef struct tagMONTH
{union{UINT uData;struct{WORD wMonth;//月名BYTE byMonthType;//月类型(MonthType)bool bLeapMonth;//是否为闰月(农历月)};};
}MONTH, *PMONTH, LPMONTH;//月份typedef struct tagDATE
{YEAR uYear;//公历年份MONTH uMonth;//公历月WORD wDay;//公历日WORD wDayOfWeek;//星期tagDATE() : wDay(0), wDayOfWeek(Dw_Sunday){}virtual tagDATE & operator =(const tagDATE & rhs){this->uYear = rhs.uYear;this->uMonth = rhs.uMonth;this->wDay = rhs.wDay;this->wDayOfWeek = rhs.wDayOfWeek;return *this;}
}DATE, *PDATE, LPDATE;//公历日期(注意:不作为对外使用类型)typedef struct tagTBElement
{WORD wTrunk;//天干WORD wBranch;//地支tagTBElement() : wTrunk(0), wBranch(0){}tagTBElement & operator =(const tagTBElement & rhs){this->wTrunk = rhs.wTrunk;this->wBranch = rhs.wBranch;return *this;}
}TBElement;//干支元素typedef struct tagDATEINFO : DATE
{TBElement tbYear;//农历纪年的天干地支,地支表示生肖(与正月初一同步,这是标准农历)WORD wDaysOfMonth;//月的总天数SHORT sDayOrdinal;//年内序数(以uYear元旦为参考)bool bLunarDate;//是否为农历日期tagDATEINFO() : wDaysOfMonth(0), sDayOrdinal(0), bLunarDate(false){}tagDATEINFO & operator =(const tagDATEINFO & rhs){this->uYear = rhs.uYear;this->uMonth = rhs.uMonth;this->wDay = rhs.wDay;this->wDayOfWeek = rhs.wDayOfWeek;this->tbYear = rhs.tbYear;this->wDaysOfMonth = rhs.wDaysOfMonth;this->sDayOrdinal = rhs.sDayOrdinal;this->bLunarDate = rhs.bLunarDate;return *this;}
}DATEINFO, *PDATEINFO, LPDATEINFO;//日期信息typedef struct tagTIME
{WORD wHour;//时WORD wMinute;//分WORD wSecond;//秒WORD wMillisecond;//毫秒tagTIME() : wHour(0) ,wMinute(0), wSecond(0), wMillisecond(0){}tagTIME & operator =(const tagTIME & rhs){this->wHour = rhs.wHour;this->wMinute = rhs.wMinute;this->wSecond = rhs.wSecond;this->wMillisecond = rhs.wMillisecond;return *this;}
}TIME, *PTIME, LPTIME;//时间typedef struct tagDATETIME : DATE, TIME
{tagDATETIME & operator =(const tagDATETIME & rhs){this->uYear = rhs.uYear;this->uMonth = rhs.uMonth;this->wDay = rhs.wDay;this->wDayOfWeek = rhs.wDayOfWeek;this->wHour = rhs.wHour;this->wMinute = rhs.wMinute;this->wSecond = rhs.wSecond;this->wMillisecond = rhs.wMillisecond;return *this;}
}DATETIME, *PDATETIME, LPDATETIME;//公历日期时间typedef struct tagLUNARMONTH
{YEAR uYear;//公历年份MONTH uMonth;//公历月WORD wDaysOfMonth;//月的总天数SHORT sNewMoonOrdinal;//新月的年内序数tagLUNARMONTH() : wDaysOfMonth(0), sNewMoonOrdinal(0){}tagLUNARMONTH & operator =(const tagLUNARMONTH & rhs){this->uYear = rhs.uYear;this->uMonth = rhs.uMonth;this->wDaysOfMonth = rhs.wDaysOfMonth;this->sNewMoonOrdinal = rhs.sNewMoonOrdinal;return *this;}
}LUNARMONTH, *PLUNARMONTH, LPLUNARMONTH;typedef struct tagSOLARTERM : DATE
{SolarTermName STName;//节气编号SHORT sSTOrdinal;//节气的年内序数tagSOLARTERM() : STName(St_InitValue), sSTOrdinal(0){}tagSOLARTERM & operator =(const tagSOLARTERM & rhs){this->uYear = rhs.uYear;this->uMonth = rhs.uMonth;this->wDay = rhs.wDay;this->wDayOfWeek = rhs.wDayOfWeek;this->sSTOrdinal = rhs.sSTOrdinal;this->STName = rhs.STName;return *this;}
}SOLARTERM, *PSOLARTERM, LPSOLARTERM;//节气typedef struct tagEXTREMESEASON
{YEAR uYear;//公历年份SHORT sYijiuOrdinal;//数九中的“一九”对应在uYear中的年内序数(二九至九九在此基础上推算可得到,故省略)SHORT sChufuOrdinal;//初伏的年内序数SHORT sMofuOrdinal;//末伏的年内序数(中伏在初伏后10天,故省略)tagEXTREMESEASON() : sYijiuOrdinal(0), sChufuOrdinal(0), sMofuOrdinal(0){}tagEXTREMESEASON & operator =(const tagEXTREMESEASON & rhs){this->uYear = rhs.uYear;this->sYijiuOrdinal = rhs.sYijiuOrdinal;this->sChufuOrdinal = rhs.sChufuOrdinal;this->sMofuOrdinal = rhs.sMofuOrdinal;return *this;}
}EXTREMESEASON, *PEXTREMESEASON, LPEXTREMESEASON;//数九、伏日typedef struct tagMEIYU
{YEAR uYear;//公历年份SHORT sRumeiOrdinal;//入梅的年内序数SHORT sChumeiOrdinal;//出梅的年内序数tagMEIYU() : sRumeiOrdinal(0), sChumeiOrdinal(0){}tagMEIYU & operator =(const tagMEIYU & rhs){this->uYear = rhs.uYear;this->sRumeiOrdinal = rhs.sRumeiOrdinal;this->sChumeiOrdinal = rhs.sChumeiOrdinal;return *this;}
}MEIYU, *PMEIYU, LPMEIYU;//梅雨typedef struct tagSHERI
{YEAR uYear;//公历年份SHORT sChunSheOrdinal;//春社日的年内序数SHORT sQiuSheOrdinal;//秋社日的年内序数tagSHERI() : sChunSheOrdinal(0), sQiuSheOrdinal(0){}tagSHERI & operator =(const tagSHERI & rhs){this->uYear = rhs.uYear;this->sChunSheOrdinal = rhs.sChunSheOrdinal;this->sQiuSheOrdinal = rhs.sQiuSheOrdinal;return *this;}
}SHERI, *PSHERI, LPSHERI;//社日typedef struct tagPHENOLOGY : DATETIME
{PhenologyName PHName;//物候名称SHORT sPheOrdial;//物候的年内序数tagPHENOLOGY() : PHName(Ph_InitValue), sPheOrdial(0){}tagPHENOLOGY & operator =(const tagPHENOLOGY & rhs){this->uYear = rhs.uYear;this->uMonth = rhs.uMonth;this->wDay = rhs.wDay;this->wDayOfWeek = rhs.wDayOfWeek;this->wHour = rhs.wHour;this->wMinute = rhs.wMinute;this->wSecond = rhs.wSecond;this->wMillisecond = rhs.wMillisecond;this->sPheOrdial = rhs.sPheOrdial;this->PHName = rhs.PHName;return *this;}
}PHENOLOGY, *PPHENOLOGY, LPPHENOLOGY; //物候typedef struct tagLUNARPHASE : DATETIME
{LunarPhaseName LPName;//月相名称SHORT sLPOrdinal;//年内序数tagLUNARPHASE() : LPName(Lp_InitValue), sLPOrdinal(0){}tagLUNARPHASE & operator =(const tagLUNARPHASE & rhs){this->uYear = rhs.uYear;this->uMonth = rhs.uMonth;this->wDay = rhs.wDay;this->wDayOfWeek = rhs.wDayOfWeek;this->wHour = rhs.wHour;this->wMinute = rhs.wMinute;this->wSecond = rhs.wSecond;this->wMillisecond = rhs.wMillisecond;this->sLPOrdinal = rhs.sLPOrdinal;this->LPName = rhs.LPName;return *this;}
}LUNARPHASE, *PLUNARPHASE, LPLUNARPHASE;//月相typedef struct tagSIZHU
{TBElement tbYear;//年柱TBElement tbMonth;//月柱TBElement tbDay;//日柱TBElement tbHour;//时柱tagSIZHU & operator =(const tagSIZHU & rhs){this->tbYear = rhs.tbYear;this->tbMonth = rhs.tbMonth;this->tbDay = rhs.tbDay;this->tbHour = rhs.tbHour;return *this;}
}SIZHU, *PSIZHU, LPSIZHU;//四柱

类的声明:

class CLunar
{
public:virtual bool GetDayOrdinal(const DATEINFO & diDate, const YEAR & uYear, SHORT & sDays) = 0;virtual bool GetDateFromOrdinal(const YEAR & uYear, SHORT sDays, DATEINFO & diDate) = 0;virtual bool GetConstellation(const DATEINFO & diDate, ConstellationName & CoIndex) = 0;virtual bool GetSizhu(const DATETIME & diDate, SIZHU & Sizhu) = 0;virtual bool DateConvert(const DATEINFO & diSrc, DATEINFO & diDest) = 0;virtual bool IsLeapYear(const YEAR & uYear, bool & bLeapYear) = 0;virtual bool GetHoliday(const YEAR & uYear, HolidayName hnCurHoliday, DATEINFO & diHoliday) = 0;virtual bool GetDays(const DATEINFO & diDate1, const DATEINFO & diDate2, long & lDays) = 0;virtual bool GetDays(const DATETIME & dtTime1, const DATETIME & dtTime2, double & dDays) = 0;virtual bool GetDate(const DATEINFO & diSrc, long lDays, DATEINFO & diDst) = 0;virtual bool GetDate(const DATETIME & dtSrc, double dDays, DATETIME & dtDst) = 0;virtual bool InitDateInfo(DATEINFO & diDst, bool bToday = true, const YEAR & uYear = 1, const MONTH & wMonth = Mn_January, WORD wDay = 1) = 0;virtual bool InitDateInfo(const DATETIME & dtSrc, DATEINFO & diDst) = 0;virtual bool InitDateTime(DATETIME & dtDst, bool bCurrentTime = true, const YEAR & uYear = 1, const MONTH & wMonth = Mn_January, WORD wDay = 1, WORD wHour = 0, WORD wMinute = 0, WORD wSecond = 0, WORD wMilliSecond = 0) = 0;virtual bool InitDateTime(const DATEINFO & diSrc, const TIME & tSrc, DATETIME & dtDst) = 0;virtual bool InitDateTime(const DATEINFO & diSrc, DATETIME & dtDst) = 0;virtual bool GetDayOfWeek(const YEAR & uYear, const MONTH & uMonth, WORD wDay, DayOfWeek & dwDst) = 0;virtual bool GetDayOfWeek(DATETIME & dtInfo) = 0;virtual bool GetDayOfWeek(DATEINFO & diDate) = 0;virtual bool GetFirstMonthInfo(const YEAR & uYear, LUNARMONTH & lmInfo) = 0;virtual bool GetNextMonthInfo(LUNARMONTH & lmInfo) = 0;virtual bool GetPreviousMonthInfo(LUNARMONTH & lmInfo) = 0;virtual bool GetMonthInfoByIndex(const YEAR & uYear, int iIndex, LUNARMONTH & lmInfo) = 0;virtual bool GetFirstSolarTerm(const YEAR & uYear, SOLARTERM & stInfo) = 0;virtual bool GetNextSolarTerm(SOLARTERM & stInfo) = 0;virtual bool GetPreviousSolarTerm(SOLARTERM & stInfo) = 0;virtual bool GetSolarTermByName(const YEAR & uYear, SolarTermName stName, SOLARTERM & stInfo) = 0;virtual bool GetSolarTerm(const YEAR & uYear, const MONTH & uMonth, WORD wDay, SOLARTERM & stInfo) = 0;virtual bool GetFirstPhase(const YEAR & uYear, const MONTH & uMonth, LUNARPHASE & lpInfo) = 0;virtual bool GetNextPhase(LUNARPHASE & lpInfo) = 0;virtual bool GetPreviousPhase(LUNARPHASE & lpInfo) = 0;virtual bool GetPhase(const YEAR & uYear, const MONTH & uMonth, WORD wDay, LUNARPHASE & lpInfo) = 0;virtual bool GetFirstPhenology(const YEAR & uYear, PHENOLOGY & phInfo) = 0;virtual bool GetNextPhenology(PHENOLOGY & phInfo) = 0;virtual bool GetPreviousPhenology(PHENOLOGY & phInfo) = 0;virtual bool GetPhenologyByName(const YEAR & uYear, PhenologyName phIndex, PHENOLOGY & phInfo) = 0;virtual bool GetPhenologyBySolarTerm(const SOLARTERM & stInfo, PHENOLOGY & phInfo) = 0;virtual bool GetPhenology(const YEAR & uYear, const MONTH & uMonth, WORD wDay, PHENOLOGY & phInfo) = 0;virtual bool GetEmperorReign(const DATEINFO & diDate, char * pBuffer, DWORD dwBufSize) = 0;virtual bool GetEmperorReign(const DATEINFO & diDate, wchar_t * pBuffer, DWORD dwBufSize) = 0;virtual MONTH GetLeapMonth(const YEAR & uYear) = 0;virtual UINT GetDaysOfMonth(const YEAR & uYear, const MONTH & uMonth) = 0;virtual UINT GetDaysOfYear(const YEAR & uYear) = 0;virtual UINT GetDaysOfLunarMonth(const YEAR & uYear, const MONTH & uLunarMonth) = 0;virtual UINT GetDaysOfLunarYear(const YEAR & uYear) = 0;
protected:CLunar(void);virtual ~CLunar(void);
};

DLL的接口定义如下:

提供的方法有以下37个:

01. GetDayOrdinal,计算某日期在该年的序数;

02. GetDateFromOrdinal,从年内序数求出日期;

03. GetConstellation,计算星座;

04. GetSiZhu,获取某一时刻的四柱(八字);

05. DateConvert,农历与公历互转;

06. IsLeapYear,判断是否为闰年(公历);

07. GetHoliday,获取其它节日(包括数九、三伏、入梅、出梅、社日、复活节);

08. GetDays,  获取两个日期之间的天数差;

09. GetDate,获取距离某个日期指定天数的日期或时间;

10. InitDateInfo,初始化日期结构体;

11. InitDateTime,初始化日期时间结构体;

12. GetDayOfWeek,获取某一天的星期;

13. GetFirstMonthInfo,获取农历某年年首月份的信息;

14. GetNextMonthInfo,获取下个农历月的信息;

15. GetPreviousMonthInfo,获取上个农历月的信息;

16. GetMonthInfoByIndex,获取农历年当中指定索引的月份信息;

17. GetFirstSolarTerm,获取一年当中首个节气信息;

18. GetNextSolarTerm,获取下一个节气信息;

19. GetPreviousSolarTerm,获取上一个节气信息;

20. GetSolarTermByIndex,获取一年当中指定节气的信息;

21. GetSolarTerm,获取公历某一天所处的节气信息;

22. GetFirstPhase,查询公历月中的第一个月相信息;

23. GetNextPhase,查询下一个月相信息;

24. GetPreviousPhase,查询上一个月相信息;

25. GetPhase,获取公历某一天所处的月相信息;

26. GetFirstPhenology,获取公历某一年当中的首个物候信息;

27. GetNextPhenology,获取下一个物候信息;

28. GetPreviousPhenology,获取上一个物候信息;

29. GetPhenologyByName,获取公历年当中指定的物候信息;

30. GetPhenologyBySolarTerm,通过节气获取物候信息;

31. GetPhenology,获取公历某一天所处的物候信息;

32. GetEmperorReign,获取年号;

33. GetDaysOfMonth,获取公历月份的总天数;

34. GetDaysOfYear,获取公历年份的总天数;

35. GetLeapMonth,获得农历闰月;

36. GetDaysOfLunarMonth,获取农历月份的总天数;

37. GetDaysOfLunarYear,获取农历年份的总天数。

使用方法(以C++为例):

1. 动态链接调用

#include "libLunar.h"//以下为代码片段
CL_CLunarInterface * pLunarIf = NULL;
HINSTANCE hLunarDll = LoadLibrary(_T("liblunar.dll"));
pLunarIfMgr lunar_interface = (pLunarIfMgr)GetProcAddress(hLunarDll, "GetLunarInterface");
pLunarIf = lunar_interface();
if (pLunarIf == NULL)
{return;
}
CL_CLunar * pLunar=NULL;
pLunarIf->GetClassPtr(Ct_Lunar,(void **)&pLunar);
if (!pLunar)
{return;
}
pLunar->GetDayOrdinal(, , );
pLunar->DateConvert(, );
//TODO:其它代码
if (pLunarIf)
{if (pLunar){pLunarIf->ReleaseClassPtr((void **)&pLunar);//此代码建议加上}pLunarIf->ReleaseInterface();pLunarIf = NULL;
}
if (hLunarDll != NULL)
{FreeLibrary(hLunarDll);//释放DLLhLunarDll = NULL;
}

2. 静态链接调用

#define USING_LUNAR_STATIC
#include "libLunar.h"#pragma comment(lib, "liblunar.lib")//以下为代码片段
CL_CLunarInterface * pLunarIf = GetLunarInterface();
if (pLunarIf == NULL)
{return;
}
pLunar->GetDayOrdinal(, , );
pLunar->DateConvert(, );
//TODO:其它代码

要实现万年历,函数调用流程如下:

1.先根据要显示的年和月,算出本月1日的星期。

2.调用GetDaysOfMonth函数来得到当前月的总天数,到这一步,一个显示公历的简单日历可以说是完成了。

3.调用GDateToLDate函数,得到公历月首的农历信息,通过一一对应关系,逐一按天来排农历,当农历到月末时,重新计算下一个月的农历信息,直到将公历月份填充完毕。

4.需要添加节气、数九、三伏、梅雨等信息的,可以通过与SOLARTERM结构体有关的函数得到二十四节气信息,通过GetExtremeSeason得到数九、三伏,以及入梅、出梅信息。

通过以上一系列函数调用,一个像模像样的万年历就制作成功了,界面可以根据自己的设计,做漂亮些(可以使用界面库),以下提供相应的资料包。

经过了多年的修正与优化,libLunar库已经比较完善,目前支持C、C++、C#调用,但后续还是会对其进行更新。

百度盘下载(2021/08/23) 密码:6und

更多推荐

C++实现带中国农历的万年历(支持C/C#)

本文发布于:2024-02-10 21:36:12,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1677413.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:万年历   中国   农历

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!