前几天,有个同事问:知道现在距离公元元年1月1日的天数,如何计算日期?此前对闰年的概念也不是很清晰,在网上查了下闰年规则,整理出一个日期转换类,贴出来和大家分享,不足之处还请多多指教!

先说下闰年规则:1、四年一闰、百年不闰、四百年再闰;2、公元元年1月1日指的是公元1年1月1日,不是公元0年1月1日;3、公元1年1月1日的这天是星期一。

下面程序中的天数的意思:从公元1年1月1日起的第多少天。

20130416修改如下:

下面的朋友指出了在把距离公元1年1月1日的天数转化为年数和剩余天数时计算方法出了问题,确实是有问题,也没想明白到底是哪里出了问题。这里就修改采用简单的累加天数计算法方法来计算年数和剩余天数,缺点就是需要执行多次循环效率可能不够高。

为了和在网上的日期计算工具计算的结果一致,这里的天数修改为距离公元1年1月1日多少天,比如公元1年1月2日距离公元1年1月1日为1天。

这里把后续增加的农历转换一并发出来,相互学习使用。

先贴出头文件内容:

/********************************************************************created: 2010/03/26created: 26:3:2010 15:28filename: CDateConversion.hfile ext: hauthor: zhangwfpurpose: 公元后日期转换类使用说明: 此类适用于以公元元年(公元1年)1月1日起至今的日期计算;闰年:4年1润,百年不润,400年再闰;公元1年1月1日为星期一; *********************************************************************/ #ifndef _CMY_DATE_CONVERSION_H_ #define _CMY_DATE_CONVERSION_H_ // #include <tchar.h> // // 定义年月日类型 typedef unsigned int MYYEAR_T; // 年类型 typedef unsigned int MYMONTH_T; // 月类型 typedef unsigned int MYDAY_T; // 日类型 typedef unsigned int MYWEEKDAY_T; // 星期类型 typedef unsigned long MYNUMS_T; // 日期数量类型// 定义数据类型 typedef unsigned short U16INT; typedef short S16INT; typedef unsigned char U8INT; typedef char S8INT; typedef unsigned long U32INT; typedef long S32INT;// 定义日期结构 typedef struct _MY_DATE_STR_ {// 默认构造为公元1年1月1日_MY_DATE_STR_(){year = 1;month = 1;day = 1;}// 带参构造函数_MY_DATE_STR_(MYYEAR_T uYear, MYMONTH_T uMonth, MYDAY_T uDay){year = uYear;month = uMonth;day = uDay;}// 成员变量MYYEAR_T year;MYMONTH_T month;MYDAY_T day; }MYDATE; // class CDateConversion { public:// 构造析构函数CDateConversion();~CDateConversion();public:// 接口函数// 判断一年是否为闰年static bool BeLeapYear(MYYEAR_T year);static bool BeLeapYear(const MYDATE &date);// 是否安全的月份和天数static bool BeSafeMonth(MYMONTH_T month);static bool BeSafeDay(MYYEAR_T year, MYMONTH_T month, MYDAY_T day);static bool BeSafeDay(const MYDATE &date);// 是否安全的日期static bool BeSafeDate(MYYEAR_T year, MYMONTH_T month, MYDAY_T day);static bool BeSafeDate(const MYDATE &date);// 取得某年总的天数static MYNUMS_T GetYearDays(MYYEAR_T year);// 取得某年某月的天数static MYNUMS_T GetMonthDays(MYYEAR_T year, MYMONTH_T month);// 计算距离公元1年1月1日经历的闰年数量(包括该年)(ADBegin表示公元起始日期即公元1年1月1日)static MYNUMS_T CalLeapYearsToADBegin(MYYEAR_T year);static MYNUMS_T CalLeapYearsToADBegin(const MYDATE &date);// 计算距离当年年初(1月1日)的天数static MYNUMS_T CalDaysToYearBegin(MYYEAR_T year, MYMONTH_T month, MYDAY_T day);static MYNUMS_T CalDaysToYearBegin(const MYDATE &date);// 根据距离当年1月1日的天数计算日期static MYDATE CalDateByDaysToYearBegin(MYYEAR_T year, MYNUMS_T dayNums);// 计算距离公元1年1月1日的天数(ADBegin表示公元起始日期即公元1年1月1日)static MYNUMS_T CalDaysToADBegin(MYYEAR_T year, MYMONTH_T month, MYDAY_T day);static MYNUMS_T CalDaysToADBegin(const MYDATE &date);// 计算两个日期之间的距离天数static MYNUMS_T CalDaysBetween(const MYDATE &dateFirst, const MYDATE &dateSecond);// 根据距离公元1年1月1日的天数确定日期static MYDATE CalDateByDaysToADBegin(MYNUMS_T dayNums);static void CalDateByDaysToADBegin(MYNUMS_T dayNums, MYDATE &date);static void CalDateByDaysToADBegin(MYNUMS_T dayNums, MYYEAR_T &year, MYMONTH_T &month, MYDAY_T &day);// 判断是否安全的星期天数static bool BeSafeWeekDay(MYWEEKDAY_T weekDay);// 根据日期及距离公元1年1月1日的天数计算星期几static MYWEEKDAY_T CalWeekDay(const MYDATE &date);static MYWEEKDAY_T CalWeekDay(MYNUMS_T dayNums);public: // 农历日期接口// 是否安全的农历年static bool BeSafeLunarYear(MYYEAR_T lunarYear);// 是否安全的农历月份和农历天数static bool BeSafeLunarMonth(MYMONTH_T lunarMonth);// 取得农历某年某月的天数,pLeapMonthDays可以带出闰月的天数,如果不是闰月则为0static MYNUMS_T GetLunarMonthDays(MYYEAR_T lunarYear, MYMONTH_T lunarMonth, MYNUMS_T *pLeapMonthDays=NULL);// 判断是否农历闰年(具有农历闰月的年称为农历闰年),pLeapMonth可以带出闰月月份如果是闰年的话static bool BeLunarLeapYear(MYYEAR_T lunarYear, MYMONTH_T *pLunarLeapMonth=NULL);// 取得农历某年总的天数,当lunarYear不在有效范围返回0static MYNUMS_T GetLunarYearDays(MYYEAR_T lunarYear);public: // 阳历日期转农历日期接口// 把阳历日期转换为农历日期(pBeLunarLeapMonth带出转换后的农历月是否正在闰的月,主要用在闰正月的闰月名称改为一月)static bool TransSolarToLunarDate(const MYDATE &solarDate, MYDATE &lunarDate, bool *pBeLunarLeapMonth=NULL);public: // 得到24节气接口// 根据阳历日期得到24节气值(0-24,0表示没有节气,1-24对应24节气)static MYNUMS_T GetSolarTerm(const MYDATE &solarDate);static MYNUMS_T GetSolarTerm(MYYEAR_T solarYear, MYMONTH_T solarMonth, MYDAY_T solardDay);// 根据24节气值得到24节气字符串(solarTermVal范围0-24,0表示没有节气,1-24对应24节气)static const TCHAR *GetSolarTermString(MYNUMS_T solarTermVal);// 根据阳历日期得到24节气的字符串static const TCHAR *GetSolarTermString(const MYDATE &solarDate);static const TCHAR *GetSolarTermString(MYYEAR_T solarYear, MYMONTH_T solarMonth, MYDAY_T solardDay);public:// 得到农历年月日的表示接口// 根据公历年格式化到农历天干地支表示字符串,成功返回的是pLunarYearBuf指针,失败返回NULL// 返回形如“庚寅.虎年”static const TCHAR *FormatToLunarYear(MYYEAR_T solarYear, // 公历年份TCHAR *pLunarYearBuf, // 输出天干地支年表示字符串缓冲区MYNUMS_T cchBufLen // 缓冲区字符数长度(必须大于等于16));// 把农历月格式化为字符串,成功返回的是pLunarMonthBuf指针,失败返回NULL// 返回形如“八月”static const TCHAR *FormatLunarMonth(MYMONTH_T lunarMonth, // 农历月份 bool bLunarLeapMonth, // 是否农历闰月TCHAR *pLunarMonthBuf, // 输出月份字符串缓冲区MYNUMS_T cchBufLen // 缓冲区字符数长度(必须大于等于16));// 把农历日格式化为字符串,成功返回的是pLunarDayBuf指针,失败返回NULL// 返回形如“十四”或“初十”static const TCHAR *FormatLunarDay(MYDAY_T lunarDay, // 农历日期TCHAR *pLunarDayBuf, // 输出日期字符串缓冲区MYNUMS_T cchBufLen // 缓冲区字符数长度(必须大于等于16)); }; // #endif

==============================================================

再贴出.cpp文件内容

/********************************************************************created: 2010/03/26created: 26:3:2010 15:29filename: CDateConversion.cppfile ext: cppauthor: zhangwfpurpose: 公元后日期转换类使用说明: 此类适用于以公元元年(公元1年)1月1日起至今的日期计算;闰年:4年1润,百年不润,400年再闰;公元1年1月1日为星期一; *********************************************************************/ // #include "CDateConversion.h" // #define MAKEU16INT(a, b) ((U16INT)(((U8INT)(a)) | ((U16INT)((U8INT)(b))) << 8)) #define MAKEU32INT(a, b) ((U32INT)(((U16INT)(a)) | ((U32INT)((U16INT)(b))) << 16)) #define LOU16INT(l) ((U16INT)(l)) #define HIU16INT(l) ((U16INT)(((U32INT)(l) >> 16) & 0xFFFF)) #define LOU8INT(w) ((U8INT)(w)) #define HIU8INT(w) ((U8INT)(((U16INT)(w) >> 8) & 0xFF)) // // 定义开始年以及结束年,确定农历有效时间段 static const U16INT G_LUNARCALENDAR_STARTYEAR = 1901; static const U16INT G_LUNARCALENDAR_ENDYEAR = 2100;// 定义1901-2100每年的闰月情况数组 // 一个字节存放两年的数据,高位表示一年,低位表示下一年 // 为0表示该年没有闰月,不为0则数值表示该年闰月月份 static const U8INT G_LunarLeapMonth[]= {0X00, 0X50, 0X04, 0X00, 0X20, // 19100X60, 0X05, 0X00, 0X20, 0X70, // 19200X05, 0X00, 0X40, 0X02, 0X06, // 19300X00, 0X50, 0X03, 0X07, 0X00, // 19400X60, 0X04, 0X00, 0X20, 0X70, // 19500X05, 0X00, 0X30, 0X80, 0X06, // 19600X00, 0X40, 0X03, 0X07, 0X00, // 19700X50, 0X04, 0X08, 0X00, 0X60, // 19800X04, 0X0a, 0X00, 0X60, 0X05, // 19900X00, 0X30, 0X80, 0X05, 0X00, // 20000X40, 0X02, 0X07, 0X00, 0X50, // 20100X04, 0X09, 0X00, 0X60, 0X04, // 20200X00, 0X20, 0X60, 0X05, 0X00, // 20300X30, 0Xb0, 0X06, 0X00, 0X50, // 20400X02, 0X07, 0X00, 0X50, 0X03, // 20500X08, 0X00, 0X60, 0X04, 0X00, // 20600X30, 0X70, 0X05, 0X00, 0X40, // 20700X80, 0X06, 0X00, 0X40, 0X03, // 20800X07, 0X00, 0X50, 0X04, 0X80, // 20900X00, 0X60, 0X04, 0X00, 0X20 // 2100 };// 定义1901.1.1 --2100.12.31的每年各个月是大月小月的数组; // 农历小月29天大月30天; // 使用了16bit位表示,只取其中的前12或13位,每一位0表示小月,1表示大月; // 当该年有闰月时取13位,否则取12位; // 该年是否有闰月,闰几月将在下面的数组给出 static const U16INT G_LunarMonthDay[]= {// 测试数据:1901.1.1 -- 2100.12.310X4ae0, 0Xa570, 0X5268, 0Xd260, 0Xd950, 0X6aa8, 0X56a0, 0X9ad0, 0X4ae8, 0X4ae0, // 19100Xa4d8, 0Xa4d0, 0Xd250, 0Xd548, 0Xb550, 0X56a0, 0X96d0, 0X95b0, 0X49b8, 0X49b0, // 19200Xa4b0, 0Xb258, 0X6a50, 0X6d40, 0Xada8, 0X2b60, 0X9570, 0X4978, 0X4970, 0X64b0, // 19300Xd4a0, 0Xea50, 0X6d48, 0X5ad0, 0X2b60, 0X9370, 0X92e0, 0Xc968, 0Xc950, 0Xd4a0, // 19400Xda50, 0Xb550, 0X56a0, 0Xaad8, 0X25d0, 0X92d0, 0Xc958, 0Xa950, 0Xb4a8, 0X6ca0, // 19500Xb550, 0X55a8, 0X4da0, 0Xa5b0, 0X52b8, 0X52b0, 0Xa950, 0Xe950, 0X6aa0, 0Xad50, // 19600Xab50, 0X4b60, 0Xa570, 0Xa570, 0X5260, 0Xe930, 0Xd950, 0X5aa8, 0X56a0, 0X96d0, // 19700X4ae8, 0X4ad0, 0Xa4d0, 0Xd268, 0Xd250, 0Xd528, 0Xb540, 0Xb6a0, 0X96d0, 0X95b0, // 19800X49b0, 0Xa4b8, 0Xa4b0, 0Xb258, 0X6a50, 0X6d40, 0Xada0, 0Xab60, 0X9370, 0X4978, // 19900X4970, 0X64b0, 0X6a50, 0Xea50, 0X6b28, 0X5ac0, 0Xab60, 0X9368, 0X92e0, 0Xc960, // 20000Xd4a8, 0Xd4a0, 0Xda50, 0X5aa8, 0X56a0, 0Xaad8, 0X25d0, 0X92d0, 0Xc958, 0Xa950, // 20100Xb4a0, 0Xb550, 0Xb550, 0X55a8, 0X4ba0, 0Xa5b0, 0X52b8, 0X52b0, 0Xa930, 0X74a8, // 20200X6aa0, 0Xad50, 0X4da8, 0X4b60, 0X9570, 0Xa4e0, 0Xd260, 0Xe930, 0Xd530, 0X5aa0, // 20300X6b50, 0X96d0, 0X4ae8, 0X4ad0, 0Xa4d0, 0Xd258, 0Xd250, 0Xd520, 0Xdaa0, 0Xb5a0, // 20400X56d0, 0X4ad8, 0X49b0, 0Xa4b8, 0Xa4b0, 0Xaa50, 0Xb528, 0X6d20, 0Xada0, 0X55b0, // 20500X9370, 0X4978, 0X4970, 0X64b0, 0X6a50, 0Xea50, 0X6b20, 0Xab60, 0Xaae0, 0X92e0, // 20600Xc970, 0Xc960, 0Xd4a8, 0Xd4a0, 0Xda50, 0X5aa8, 0X56a0, 0Xa6d0, 0X52e8, 0X52d0, // 20700Xa958, 0Xa950, 0Xb4a0, 0Xb550, 0Xad50, 0X55a0, 0Xa5d0, 0Xa5b0, 0X52b0, 0Xa938, // 20800X6930, 0X7298, 0X6aa0, 0Xad50, 0X4da8, 0X4b60, 0Xa570, 0X5270, 0Xd260, 0Xe930, // 20900Xd520, 0Xdaa0, 0X6b50, 0X56d0, 0X4ae0, 0Xa4e8, 0Xa4d0, 0Xd150, 0Xd928, 0Xd520, // 2100 };// 定义24节气数组 // 每年的二十四节气对应的阳历日期几乎固定,平均分布于十二个月中 // 24节气为: // 1月 2月 3月 4月 5月 6月 // 小寒 大寒 立春 雨水 惊蛰 春分 清明 谷雨 立夏 小满 芒种 夏至 // 7月 8月 9月 10月 11月 12月 // 小暑 大暑 立秋 处暑 白露 秋分 寒露 霜降 立冬 小雪 大雪 冬至 // 定义24节气字符串数组 static const TCHAR *G_SOLAR_TERMS_STRING[] = {_T(""), // 索引0表示没有节气_T("小寒"), _T("大寒"), // 依次对应每个月的节气_T("立春"), _T("雨水"),_T("惊蛰"), _T("春分"),_T("清明"), _T("谷雨"),_T("立夏"), _T("小满"),_T("芒种"), _T("夏至"),_T("小暑"), _T("大暑"),_T("立秋"), _T("处暑"),_T("白露"), _T("秋分"),_T("寒露"), _T("霜降"),_T("立冬"), _T("小雪"),_T("大雪"), _T("冬至") };// 例如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,每月用一个字节存放,高位存放第一个节气数据,低位存放第二个节气的数据 // 上面的方法是便于存储,实际取得数据仍然要按相反的规则转换 // 在实际取节气日期时15-取得第一个节气,取得第二个节气+15得到实际节气日期 // 节气信息根据公历存储 static const U8INT G_LunarHolDay[]= {0X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X78, 0X79, 0X79, 0X69, 0X78, 0X77, // 19010X96, 0XA4, 0X96, 0X96, 0X97, 0X87, 0X79, 0X79, 0X79, 0X69, 0X78, 0X78, // 19020X96, 0XA5, 0X87, 0X96, 0X87, 0X87, 0X79, 0X69, 0X69, 0X69, 0X78, 0X78, // 19030X86, 0XA5, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X79, 0X78, 0X87, // 19040X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X78, 0X79, 0X79, 0X69, 0X78, 0X77, // 19050X96, 0XA4, 0X96, 0X96, 0X97, 0X97, 0X79, 0X79, 0X79, 0X69, 0X78, 0X78, // 19060X96, 0XA5, 0X87, 0X96, 0X87, 0X87, 0X79, 0X69, 0X69, 0X69, 0X78, 0X78, // 19070X86, 0XA5, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X69, 0X78, 0X87, // 19080X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X78, 0X79, 0X79, 0X69, 0X78, 0X77, // 19090X96, 0XA4, 0X96, 0X96, 0X97, 0X97, 0X79, 0X79, 0X79, 0X69, 0X78, 0X78, // 19100X96, 0XA5, 0X87, 0X96, 0X87, 0X87, 0X79, 0X69, 0X69, 0X69, 0X78, 0X78, // 19110X86, 0XA5, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X69, 0X78, 0X87, // 19120X95, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X78, 0X79, 0X79, 0X69, 0X78, 0X77, // 19130X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X79, 0X79, 0X79, 0X69, 0X78, 0X78, // 19140X96, 0XA5, 0X97, 0X96, 0X97, 0X87, 0X79, 0X79, 0X69, 0X69, 0X78, 0X78, // 19150X96, 0XA5, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X79, 0X77, 0X87, // 19160X95, 0XB4, 0X96, 0XA6, 0X96, 0X97, 0X78, 0X79, 0X78, 0X69, 0X78, 0X87, // 19170X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X79, 0X79, 0X79, 0X69, 0X78, 0X77, // 19180X96, 0XA5, 0X97, 0X96, 0X97, 0X87, 0X79, 0X79, 0X69, 0X69, 0X78, 0X78, // 19190X96, 0XA5, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X79, 0X77, 0X87, // 19200X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X78, 0X79, 0X78, 0X69, 0X78, 0X87, // 19210X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X79, 0X79, 0X79, 0X69, 0X78, 0X77, // 19220X96, 0XA4, 0X96, 0X96, 0X97, 0X87, 0X79, 0X79, 0X69, 0X69, 0X78, 0X78, // 19230X96, 0XA5, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X79, 0X77, 0X87, // 19240X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X78, 0X79, 0X78, 0X69, 0X78, 0X87, // 19250X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X78, 0X79, 0X79, 0X69, 0X78, 0X77, // 19260X96, 0XA4, 0X96, 0X96, 0X97, 0X87, 0X79, 0X79, 0X79, 0X69, 0X78, 0X78, // 19270X96, 0XA5, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X78, 0X87, 0X87, // 19280X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X79, 0X77, 0X87, // 19290X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X78, 0X79, 0X79, 0X69, 0X78, 0X77, // 19300X96, 0XA4, 0X96, 0X96, 0X97, 0X87, 0X79, 0X79, 0X79, 0X69, 0X78, 0X78, // 19310X96, 0XA5, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X78, 0X87, 0X87, // 19320X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X69, 0X78, 0X87, // 19330X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X78, 0X79, 0X79, 0X69, 0X78, 0X77, // 19340X96, 0XA4, 0X96, 0X96, 0X97, 0X97, 0X79, 0X79, 0X79, 0X69, 0X78, 0X78, // 19350X96, 0XA5, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X78, 0X87, 0X87, // 19360X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X69, 0X78, 0X87, // 19370X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X78, 0X79, 0X79, 0X69, 0X78, 0X77, // 19380X96, 0XA4, 0X96, 0X96, 0X97, 0X97, 0X79, 0X79, 0X79, 0X69, 0X78, 0X78, // 19390X96, 0XA5, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X78, 0X87, 0X87, // 19400X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X69, 0X78, 0X87, // 19410X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X78, 0X79, 0X79, 0X69, 0X78, 0X77, // 19420X96, 0XA4, 0X96, 0X96, 0X97, 0X97, 0X79, 0X79, 0X79, 0X69, 0X78, 0X78, // 19430X96, 0XA5, 0X96, 0XA5, 0XA6, 0X96, 0X88, 0X78, 0X78, 0X78, 0X87, 0X87, // 19440X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X79, 0X77, 0X87, // 19450X95, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X78, 0X79, 0X78, 0X69, 0X78, 0X77, // 19460X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X79, 0X79, 0X79, 0X69, 0X78, 0X78, // 19470X96, 0XA5, 0XA6, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87, // 19480XA5, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X79, 0X78, 0X79, 0X77, 0X87, // 19490X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X78, 0X79, 0X78, 0X69, 0X78, 0X77, // 19500X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X79, 0X79, 0X79, 0X69, 0X78, 0X78, // 19510X96, 0XA5, 0XA6, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87, // 19520XA5, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X79, 0X77, 0X87, // 19530X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X78, 0X79, 0X78, 0X68, 0X78, 0X87, // 19540X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X78, 0X79, 0X79, 0X69, 0X78, 0X77, // 19550X96, 0XA5, 0XA5, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87, // 19560XA5, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X79, 0X77, 0X87, // 19570X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X69, 0X78, 0X87, // 19580X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X78, 0X79, 0X79, 0X69, 0X78, 0X77, // 19590X96, 0XA4, 0XA5, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87, // 19600XA5, 0XB4, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X78, 0X87, 0X87, // 19610X96, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X69, 0X78, 0X87, // 19620X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X78, 0X79, 0X79, 0X69, 0X78, 0X77, // 19630X96, 0XA4, 0XA5, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87, // 19640XA5, 0XB4, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X78, 0X87, 0X87, // 19650X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X69, 0X78, 0X87, // 19660X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X78, 0X79, 0X79, 0X69, 0X78, 0X77, // 19670X96, 0XA4, 0XA5, 0XA5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87, // 19680XA5, 0XB4, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X78, 0X87, 0X87, // 19690X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X69, 0X78, 0X87, // 19700X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X78, 0X79, 0X79, 0X69, 0X78, 0X77, // 19710X96, 0XA4, 0XA5, 0XA5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87, // 19720XA5, 0XB5, 0X96, 0XA5, 0XA6, 0X96, 0X88, 0X78, 0X78, 0X78, 0X87, 0X87, // 19730X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X69, 0X78, 0X87, // 19740X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X78, 0X79, 0X78, 0X69, 0X78, 0X77, // 19750X96, 0XA4, 0XA5, 0XB5, 0XA6, 0XA6, 0X88, 0X89, 0X88, 0X78, 0X87, 0X87, // 19760XA5, 0XB4, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87, // 19770X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X79, 0X78, 0X87, // 19780X96, 0XB4, 0X96, 0XA6, 0X96, 0X97, 0X78, 0X79, 0X78, 0X69, 0X78, 0X77, // 19790X96, 0XA4, 0XA5, 0XB5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87, // 19800XA5, 0XB4, 0X96, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X77, 0X87, // 19810X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X79, 0X77, 0X87, // 19820X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X78, 0X79, 0X78, 0X69, 0X78, 0X77, // 19830X96, 0XB4, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X87, // 19840XA5, 0XB4, 0XA6, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87, // 19850XA5, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X79, 0X77, 0X87, // 19860X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X79, 0X78, 0X69, 0X78, 0X87, // 19870X96, 0XB4, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X86, // 19880XA5, 0XB4, 0XA5, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87, // 19890XA5, 0XB4, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X79, 0X77, 0X87, // 19900X95, 0XB4, 0X96, 0XA5, 0X86, 0X97, 0X88, 0X78, 0X78, 0X69, 0X78, 0X87, // 19910X96, 0XB4, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X86, // 19920XA5, 0XB3, 0XA5, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87, // 19930XA5, 0XB4, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X78, 0X87, 0X87, // 19940X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X76, 0X78, 0X69, 0X78, 0X87, // 19950X96, 0XB4, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X86, // 19960XA5, 0XB3, 0XA5, 0XA5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87, // 19970XA5, 0XB4, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X78, 0X87, 0X87, // 19980X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X69, 0X78, 0X87, // 19990X96, 0XB4, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X86, // 20000XA5, 0XB3, 0XA5, 0XA5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87, // 20010XA5, 0XB4, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X78, 0X87, 0X87, // 20020X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X69, 0X78, 0X87, // 20030X96, 0XB4, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X86, // 20040XA5, 0XB3, 0XA5, 0XA5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87, // 20050XA5, 0XB4, 0X96, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87, // 20060X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X69, 0X78, 0X87, // 20070X96, 0XB4, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X87, 0X78, 0X87, 0X86, // 20080XA5, 0XB3, 0XA5, 0XB5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87, // 20090XA5, 0XB4, 0X96, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87, // 20100X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X79, 0X78, 0X87, // 20110X96, 0XB4, 0XA5, 0XB5, 0XA5, 0XA6, 0X87, 0X88, 0X87, 0X78, 0X87, 0X86, // 20120XA5, 0XB3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X87, // 20130XA5, 0XB4, 0X96, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87, // 20140X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X79, 0X77, 0X87, // 20150X95, 0XB4, 0XA5, 0XB4, 0XA5, 0XA6, 0X87, 0X88, 0X87, 0X78, 0X87, 0X86, // 20160XA5, 0XC3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X87, // 20170XA5, 0XB4, 0XA6, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87, // 20180XA5, 0XB4, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X79, 0X77, 0X87, // 20190X95, 0XB4, 0XA5, 0XB4, 0XA5, 0XA6, 0X97, 0X87, 0X87, 0X78, 0X87, 0X86, // 20200XA5, 0XC3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X86, // 20210XA5, 0XB4, 0XA5, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87, // 20220XA5, 0XB4, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X79, 0X77, 0X87, // 20230X95, 0XB4, 0XA5, 0XB4, 0XA5, 0XA6, 0X97, 0X87, 0X87, 0X78, 0X87, 0X96, // 20240XA5, 0XC3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X86, // 20250XA5, 0XB3, 0XA5, 0XA5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87, // 20260XA5, 0XB4, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X78, 0X87, 0X87, // 20270X95, 0XB4, 0XA5, 0XB4, 0XA5, 0XA6, 0X97, 0X87, 0X87, 0X78, 0X87, 0X96, // 20280XA5, 0XC3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X86, // 20290XA5, 0XB3, 0XA5, 0XA5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87, // 20300XA5, 0XB4, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X78, 0X87, 0X87, // 20310X95, 0XB4, 0XA5, 0XB4, 0XA5, 0XA6, 0X97, 0X87, 0X87, 0X78, 0X87, 0X96, // 20320XA5, 0XC3, 0XA5, 0XB5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X86, // 20330XA5, 0XB3, 0XA5, 0XA5, 0XA6, 0XA6, 0X88, 0X78, 0X88, 0X78, 0X87, 0X87, // 20340XA5, 0XB4, 0X96, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87, // 20350X95, 0XB4, 0XA5, 0XB4, 0XA5, 0XA6, 0X97, 0X87, 0X87, 0X78, 0X87, 0X96, // 20360XA5, 0XC3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X86, // 20370XA5, 0XB3, 0XA5, 0XA5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87, // 20380XA5, 0XB4, 0X96, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87, // 20390X95, 0XB4, 0XA5, 0XB4, 0XA5, 0XA6, 0X97, 0X87, 0X87, 0X78, 0X87, 0X96, // 20400XA5, 0XC3, 0XA5, 0XB5, 0XA5, 0XA6, 0X87, 0X88, 0X87, 0X78, 0X87, 0X86, // 20410XA5, 0XB3, 0XA5, 0XB5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87, // 20420XA5, 0XB4, 0X96, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87, // 20430X95, 0XB4, 0XA5, 0XB4, 0XA5, 0XA6, 0X97, 0X87, 0X87, 0X88, 0X87, 0X96, // 20440XA5, 0XC3, 0XA5, 0XB4, 0XA5, 0XA6, 0X87, 0X88, 0X87, 0X78, 0X87, 0X86, // 20450XA5, 0XB3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X87, // 20460XA5, 0XB4, 0X96, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87, // 20470X95, 0XB4, 0XA5, 0XB4, 0XA5, 0XA5, 0X97, 0X87, 0X87, 0X88, 0X86, 0X96, // 20480XA4, 0XC3, 0XA5, 0XA5, 0XA5, 0XA6, 0X97, 0X87, 0X87, 0X78, 0X87, 0X86, // 20490XA5, 0XC3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X78, 0X78, 0X87, 0X87, // 20500XA5, 0XB3, 0XA5, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87, // 20510XA5, 0XB4, 0XA5, 0XB4, 0XA5, 0XA6, 0X97, 0X78, 0X87, 0X88, 0X86, 0X96, // 20520XA4, 0XC4, 0XA5, 0XB4, 0XA5, 0XA6, 0X87, 0X88, 0X87, 0X78, 0X87, 0X96, // 20530XA5, 0XC3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X86, // 20540XA5, 0XB3, 0XA5, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87, // 20550XA5, 0XB4, 0XA5, 0XB4, 0XA5, 0XA6, 0X97, 0X87, 0X87, 0X78, 0X96, 0X96, // 20560XA4, 0XB3, 0XA5, 0XB4, 0XA5, 0XA6, 0X97, 0X87, 0X87, 0X78, 0X87, 0X96, // 20570XA5, 0XC3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X86, // 20580XA5, 0XB3, 0XA5, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87, // 20590XA5, 0XB4, 0XA5, 0XB4, 0XA5, 0XA5, 0X97, 0X87, 0X87, 0X87, 0X96, 0X96, // 20600XA4, 0XC3, 0XA5, 0XB4, 0XA5, 0XA6, 0X97, 0X87, 0X87, 0X78, 0X87, 0X96, // 20610XA5, 0XC3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X86, // 20620XA5, 0XB3, 0XA5, 0XA5, 0XA6, 0X96, 0X87, 0X87, 0X87, 0X78, 0X87, 0X87, // 20630XA5, 0XB4, 0XA5, 0XB4, 0XA5, 0XA5, 0X97, 0X87, 0X87, 0X78, 0X96, 0X96, // 20640XA4, 0XC3, 0XA5, 0XB4, 0XA5, 0XA6, 0X97, 0X87, 0X87, 0X78, 0X87, 0X96, // 20650XA5, 0XC3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X86, // 20660XA5, 0XB3, 0XA5, 0XA5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87, // 20670XA5, 0XB4, 0XA5, 0XB4, 0XA5, 0XA5, 0X97, 0X87, 0X87, 0X78, 0X96, 0X96, // 20680XA4, 0XC3, 0XA5, 0XB4, 0XA5, 0XA6, 0X97, 0X87, 0X87, 0X78, 0X87, 0X96, // 20690XA4, 0XC3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X86, // 20700XA5, 0XC3, 0XA5, 0XB5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87, // 20710XA5, 0XB3, 0XA5, 0XB4, 0XB5, 0XA5, 0X97, 0X87, 0X78, 0X87, 0X96, 0X96, // 20720XB4, 0XC3, 0XA5, 0XB4, 0XA5, 0XA6, 0X97, 0X78, 0X78, 0X88, 0X86, 0X96, // 20730XA4, 0XC3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X87, 0X78, 0X87, 0X86, // 20740XA5, 0XC3, 0XA5, 0XB5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X86, // 20750XA5, 0XB4, 0XB5, 0XB4, 0XB5, 0XA5, 0X97, 0X97, 0X87, 0X87, 0X96, 0X96, // 20760XB4, 0XC3, 0XA5, 0XB4, 0XA5, 0XA6, 0X97, 0X78, 0X87, 0X88, 0X86, 0X96, // 20770XA4, 0XC3, 0XA5, 0XB5, 0XA5, 0XA6, 0X87, 0X88, 0X87, 0X78, 0X87, 0X96, // 20780XA5, 0XC3, 0XA5, 0XB5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X86, // 20790XA5, 0XB4, 0XB4, 0XB5, 0XB4, 0XA5, 0X97, 0X97, 0X87, 0X87, 0X96, 0X96, // 20800XB4, 0XC3, 0XA5, 0XB4, 0XA5, 0XA6, 0X97, 0X87, 0X87, 0X88, 0X86, 0X96, // 20810XA4, 0XC3, 0XA5, 0XB4, 0XA5, 0XA6, 0X87, 0X88, 0X87, 0X78, 0X87, 0X96, // 20820XA5, 0XC3, 0XA5, 0XB5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X86, // 20830XA5, 0XB3, 0XB4, 0XB4, 0XB5, 0XA5, 0X97, 0X97, 0X87, 0X87, 0X96, 0X96, // 20840XB4, 0XC3, 0XA5, 0XB4, 0XA5, 0XA6, 0X97, 0X87, 0X87, 0X88, 0X86, 0X96, // 20850XA4, 0XC3, 0XA5, 0XB4, 0XA5, 0XA6, 0X87, 0X88, 0X87, 0X78, 0X87, 0X96, // 20860XA5, 0XC3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X86, // 20870XA5, 0XB3, 0XB4, 0XB4, 0XB5, 0XA5, 0X97, 0X97, 0X87, 0X87, 0X96, 0X96, // 20880XB4, 0XC3, 0XA5, 0XB4, 0XA5, 0XA6, 0X97, 0X87, 0X87, 0X87, 0X96, 0X96, // 20890XA4, 0XC3, 0XA5, 0XB4, 0XA5, 0XA6, 0X97, 0X87, 0X87, 0X78, 0X87, 0X96, // 20900XA5, 0XC3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X86, // 20910XA5, 0XB3, 0XB4, 0XB4, 0XB5, 0XA5, 0X97, 0X97, 0X97, 0X87, 0X96, 0X96, // 20920XB4, 0XC3, 0XA5, 0XB4, 0XA5, 0XA5, 0X97, 0X87, 0X87, 0X87, 0X96, 0X96, // 20930XA4, 0XC3, 0XA5, 0XB4, 0XA5, 0XA6, 0X97, 0X87, 0X87, 0X78, 0X87, 0X96, // 20940XA5, 0XC3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X86, // 20950XA5, 0XB3, 0XB4, 0XB4, 0XB5, 0XB5, 0X97, 0X97, 0X97, 0X87, 0X96, 0X96, // 20960XB4, 0XC3, 0XA5, 0XB4, 0XA5, 0XA5, 0X97, 0X87, 0X87, 0X87, 0X96, 0X96, // 20970XA4, 0XC3, 0XA5, 0XB4, 0XA5, 0XA6, 0X97, 0X87, 0X87, 0X78, 0X87, 0X96, // 20980XA5, 0XC3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X86, // 20990XA5, 0XB3, 0XA5, 0XA5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87, // 2100 };// // 构造函数 CDateConversion::CDateConversion() {}// 析构函数 CDateConversion::~CDateConversion() {}// // 接口函数 // 判断一年是否为闰年 bool CDateConversion::BeLeapYear(MYYEAR_T year) {// 四年一闰,百年不闰,四百年再闰return ((year%4==0 && year%100!=0) || year%400==0); }bool CDateConversion::BeLeapYear(const MYDATE &date) {return BeLeapYear(date.year); }// 是否安全的月份 bool CDateConversion::BeSafeMonth(MYMONTH_T month) {return (month>=1 && month<=12); }// 判断是否有效的天天数 bool CDateConversion::BeSafeDay(MYYEAR_T year, MYMONTH_T month, MYDAY_T day) {return (day>=1 && day<=GetMonthDays(year, month)); }// 判断是否安全的天数 bool CDateConversion::BeSafeDay(const MYDATE &date) {return BeSafeDay(date.year, date.month, date.day); }// 是否安全的日期 bool CDateConversion::BeSafeDate(MYYEAR_T year, MYMONTH_T month, MYDAY_T day) {return (BeSafeMonth(month) && BeSafeDay(year, month, day)); }bool CDateConversion::BeSafeDate(const MYDATE &date) {return BeSafeDate(date.year, date.month, date.day); }// 取得某年总的天数 MYNUMS_T CDateConversion::GetYearDays(MYYEAR_T year) {return BeLeapYear(year) ? 366 : 365; }// 取得某年某月的天数 MYNUMS_T CDateConversion::GetMonthDays(MYYEAR_T year, MYMONTH_T month) {MYNUMS_T nDays = 0;switch (month){// 大月case 1:case 3:case 5:case 7:case 8:case 10:case 12:nDays = 31;break;// 小月case 4:case 6:case 9:case 11:nDays = 30;break;// 平月case 2:nDays = BeLeapYear(year) ? 29 : 28; break;default:break;}return nDays; }// 计算距离公元1年1月1日经历的闰年数量(ADBegin表示公元起始日期即公元1年1月1日) MYNUMS_T CDateConversion::CalLeapYearsToADBegin(MYYEAR_T year) {// 每400年有97个闰年,每100年有24个闰年,每4年有1个闰年return (year/400)*(24*4+1) + ((year%400)/100)*24 + ((year%100)/4)*1; }MYNUMS_T CDateConversion::CalLeapYearsToADBegin(const MYDATE &date) {return CalLeapYearsToADBegin(date.year); }// 计算距离当年年初(1月1日)的天数 MYNUMS_T CDateConversion::CalDaysToYearBegin(MYYEAR_T year, MYMONTH_T month, MYDAY_T day) { // 返回值MYNUMS_T nDays = 0;// 不是有效的日期if (!BeSafeDate(year, month, day)){return nDays;}// 计算此前月份的总天数for (MYMONTH_T monthIndex=1; monthIndex<month; monthIndex++){nDays += GetMonthDays(year, monthIndex);}// 返回距离年初的天数return nDays + day;}MYNUMS_T CDateConversion::CalDaysToYearBegin(const MYDATE &date) {return CalDaysToYearBegin(date.year, date.month, date.day); }// 根据距离当年1月1日的天数计算日期 MYDATE CDateConversion::CalDateByDaysToYearBegin(MYYEAR_T year, MYNUMS_T dayNums) {// 如果是0天表示上一年的最后一天if (dayNums == 0){return MYDATE(year-1, 12, 31);}// 判断是几月MYNUMS_T nDays = 0;MYMONTH_T nMonthIndex = 1;while (nMonthIndex <= 12){nDays += GetMonthDays(year, nMonthIndex);if (nDays >= dayNums){nDays -= GetMonthDays(year, nMonthIndex); break;}nMonthIndex++;}return (nMonthIndex > 12) ? MYDATE() : MYDATE(year, nMonthIndex, dayNums-nDays); }// 计算距离公元1年1月1日的天数(ADBegin表示公元起始日期即公元1年1月1日) MYNUMS_T CDateConversion::CalDaysToADBegin(MYYEAR_T year, MYMONTH_T month, MYDAY_T day) { // 不是有效的日期if (!BeSafeDate(year, month, day)){return 0;}// 计算到公元1年的闰年数量MYNUMS_T nLeapYears = CalLeapYearsToADBegin(year);// 若此年是闰年则从闰年中去掉if (BeLeapYear(year)){nLeapYears -= 1;}// 得到总天数return nLeapYears*366 + (year-1-nLeapYears)*365 + CalDaysToYearBegin(year, month, day);}MYNUMS_T CDateConversion::CalDaysToADBegin(const MYDATE &date) {return CalDaysToADBegin(date.year, date.month, date.day); }// 计算两个日期之间的距离天数 MYNUMS_T CDateConversion::CalDaysBetween(const MYDATE &dateFirst, const MYDATE &dateSecond) {MYNUMS_T nDaysFirst = CalDaysToADBegin(dateFirst);MYNUMS_T nDaysSecond = CalDaysToADBegin(dateSecond);return (nDaysFirst > nDaysSecond) ? (nDaysFirst - nDaysSecond) : (nDaysSecond - nDaysFirst); }// 根据距离公元1年1月1日的天数确定日期 MYDATE CDateConversion::CalDateByDaysToADBegin(MYNUMS_T dayNums) {// 临时记录剩余的天数,是从公元公元1年1月1日开始计算的第几天,故增加1天MYNUMS_T nTmpDays = dayNums + 1;// 采用累加求年数MYYEAR_T year = 1;MYNUMS_T yearDays = GetYearDays(year);while (nTmpDays >= yearDays){year += 1;nTmpDays -= yearDays;yearDays = GetYearDays(year); } // 根据距离年初的天数计算日期return CalDateByDaysToYearBegin(year, nTmpDays); }void CDateConversion::CalDateByDaysToADBegin(MYNUMS_T dayNums, MYDATE &date) {date = CalDateByDaysToADBegin(dayNums); }void CDateConversion::CalDateByDaysToADBegin(MYNUMS_T dayNums, MYYEAR_T &year, MYMONTH_T &month, MYDAY_T &day) {MYDATE date = CalDateByDaysToADBegin(dayNums);year = date.year;month = date.month;day = date.day; }// 判断是否安全的星期天数 bool CDateConversion::BeSafeWeekDay(MYWEEKDAY_T weekDay) {return (weekDay>=0 && weekDay<=6); }// 根据日期星期几 MYWEEKDAY_T CDateConversion::CalWeekDay(const MYDATE &date) {return CalDaysToADBegin(date) % 7; }// 根据距离公元1年1月1日的天数计算星期几 MYWEEKDAY_T CDateConversion::CalWeekDay(MYNUMS_T dayNums) {return dayNums % 7; }// // 农历转换接口 // 是否安全的农历年份 bool CDateConversion::BeSafeLunarYear(MYYEAR_T lunarYear) {return (lunarYear>=G_LUNARCALENDAR_STARTYEAR && lunarYear<=G_LUNARCALENDAR_ENDYEAR); }// 是否安全的农历月份 bool CDateConversion::BeSafeLunarMonth(MYMONTH_T lunarMonth) {return (lunarMonth>=1 && lunarMonth<=12); }// 取得农历某年某月的天数,pLeapMonthDays可以带出闰月的天数,如果不是闰月则为0 MYNUMS_T CDateConversion::GetLunarMonthDays(MYYEAR_T lunarYear, MYMONTH_T lunarMonth, MYNUMS_T *pLeapMonthDays) {// 清除闰月天数if (pLeapMonthDays != NULL){*pLeapMonthDays = 0;}// 农历年是否有效if (!BeSafeLunarYear(lunarYear)){return 0;}// 月份是否有效if (!BeSafeLunarMonth(lunarMonth)){return 0;}// 得到该年的闰月月份, 为0表示没有闰月MYMONTH_T lunarLeapMonth = 0;BeLunarLeapYear(lunarYear, &lunarLeapMonth);// 存放结果MYNUMS_T lunarMonthDays = 29;// 记录当前月的bit位置(1月在高15位,二进制从右到左是低位到高位)U16INT uBit = 16 - lunarMonth; // 当前月之前有闰月则BIT位向右移动一位if (lunarLeapMonth>0 && lunarMonth>lunarLeapMonth){uBit -= 1;}// 判断对应位是否不为0,为0表示小月,为1表示大月if ((G_LunarMonthDay[lunarYear-G_LUNARCALENDAR_STARTYEAR] & (1<<uBit)) > 0){lunarMonthDays += 1;}// 判断是否得到闰月的天数if (pLeapMonthDays!=NULL && lunarMonth==lunarLeapMonth){ *pLeapMonthDays = ((G_LunarMonthDay[lunarYear-G_LUNARCALENDAR_STARTYEAR] & (1<<(uBit-1)))>0) ? 30 : 29;} // 返回农历月的天数return lunarMonthDays; }// 判断是否农历闰年(具有农历闰月的年称为农历闰年),pLeapMonth可以带出闰月月份如果是闰年的话 bool CDateConversion::BeLunarLeapYear(MYYEAR_T lunarYear, MYMONTH_T *pLunarLeapMonth) {// 清除闰月信息if (pLunarLeapMonth != NULL){*pLunarLeapMonth = 0;}// 不是安全的农历年if (!BeSafeLunarYear(lunarYear)){return false;}// 得到闰月值U8INT yearLeapMonth = G_LunarLeapMonth[(lunarYear-G_LUNARCALENDAR_STARTYEAR)/2];U8INT uLunarLeapMonth = ((lunarYear-G_LUNARCALENDAR_STARTYEAR)%2==0) ? (yearLeapMonth >> 4) : (yearLeapMonth & 0x0f);// 带出结果if (pLunarLeapMonth != NULL){*pLunarLeapMonth = uLunarLeapMonth;}// 返回return (uLunarLeapMonth != 0); }// 取得农历某年总的天数,当lunarYear不在有效范围返回0 MYNUMS_T CDateConversion::GetLunarYearDays(MYYEAR_T lunarYear) {// 不是有效的农历年if (!BeSafeLunarYear(lunarYear)){return 0;}// 存放农历年的天数MYNUMS_T lunarYearDays = 0; // 遍历得到该年总的天数MYNUMS_T lunarMonthDays = 0;MYNUMS_T lunarLeapMonthDays = 0;for(MYMONTH_T month=1; month<=12; month++){ lunarMonthDays = GetLunarMonthDays(lunarYear, month, &lunarLeapMonthDays);lunarYearDays += lunarMonthDays;lunarYearDays += lunarLeapMonthDays; }// 返回结果return lunarYearDays; }// // 阳历转农历接口 // 把阳历日期转换为农历日期(pBeLunarLeapMonth带出转换后的农历月是否正在闰的月,主要用在闰正月的闰月名称改为一月) bool CDateConversion::TransSolarToLunarDate(const MYDATE &solarDate, MYDATE &lunarDate, bool *pBeLunarLeapMonth) {// 不是安全的阳历日期if (!BeSafeDate(solarDate)){return false;}// 阳历年份错误if (solarDate.year<G_LUNARCALENDAR_STARTYEAR || solarDate.year>G_LUNARCALENDAR_ENDYEAR){return false;}// 计算阳历日期距离1901-1-1日的天数MYNUMS_T iSpanDays = CalDaysBetween(solarDate, MYDATE(1901, 1, 1));// 存放农历日期MYNUMS_T iLunarYear = 0;MYNUMS_T iLunarMonth = 0;MYNUMS_T iLunarDay = 0;// 阳历1901年2月19日为阴历1901年正月初一 // 阳历1901年1月1日到2月19日共有49天if (iSpanDays < 49){ // 得到农历年份iLunarYear = G_LUNARCALENDAR_STARTYEAR - 1;// 得到农历月份及天数if (iSpanDays < 19){iLunarMonth = 11;iLunarDay = 11 + iSpanDays;}else{iLunarMonth = 12;iLunarDay = iSpanDays - 18;}// 带出结果lunarDate.year = iLunarYear;lunarDate.month = iLunarMonth;lunarDate.day = iLunarDay;// 不是闰月if (pBeLunarLeapMonth != NULL){*pBeLunarLeapMonth = false;}return true;}////下面从阴历1901年正月初一算起 iSpanDays -= 49;// 计算年iLunarYear = G_LUNARCALENDAR_STARTYEAR;MYNUMS_T tmp = GetLunarYearDays(iLunarYear);while (iSpanDays >= tmp){iSpanDays -= tmp;iLunarYear += 1;tmp = GetLunarYearDays(iLunarYear);}// 得到该年的闰月MYMONTH_T lunarLeapMonth = 0;BeLunarLeapYear(iLunarYear, &lunarLeapMonth);// 计算月iLunarMonth = 1;bool bLunarLeapMonth = false;MYNUMS_T lunarLeapMonthDays = 0;tmp = GetLunarMonthDays(iLunarYear, iLunarMonth, &lunarLeapMonthDays);while (iSpanDays >= tmp){// 减去该月的天数iSpanDays -= tmp;// 该月是闰月if (iLunarMonth == lunarLeapMonth){tmp = lunarLeapMonthDays;if (iSpanDays < tmp){bLunarLeapMonth = true;break;} iSpanDays -= tmp;}// 得到下一个月的天数iLunarMonth += 1;tmp = GetLunarMonthDays(iLunarYear, iLunarMonth, &lunarLeapMonthDays);}// 得到是否闰月if (pBeLunarLeapMonth != NULL){*pBeLunarLeapMonth = bLunarLeapMonth;}// 计算日iLunarDay = 1;iLunarDay += iSpanDays; // 带出结果lunarDate.year = iLunarYear;lunarDate.month = iLunarMonth;lunarDate.day = iLunarDay; return true; }// // 得到24节气接口 // 根据阳历日期得到24节气值(0-24,0表示没有节气,1-24对应24节气) MYNUMS_T CDateConversion::GetSolarTerm(const MYDATE &solarDate) {return GetSolarTerm(solarDate.year, solarDate.month, solarDate.day); }// 根据阳历日期得到24节气值(0-24,0表示没有节气,1-24对应24节气) MYNUMS_T CDateConversion::GetSolarTerm(MYYEAR_T solarYear, MYMONTH_T solarMonth, MYDAY_T solardDay) {// 判断年是否有效if (solarYear<G_LUNARCALENDAR_STARTYEAR || solarYear>G_LUNARCALENDAR_ENDYEAR){return 0;}// 月是否安全if (!BeSafeMonth(solarMonth)){return 0;}// 得到该月对应的节气数据值U8INT solarTermVal = G_LunarHolDay[(solarYear-G_LUNARCALENDAR_STARTYEAR)*12 + solarMonth - 1];// 得到具体节气日期U8INT solarTermDay = 0;if (solardDay < 15){solarTermDay = 15 - ((solarTermVal >> 4) & 0x0f);} else{solarTermDay = 15 + (solarTermVal & 0x0f);}// 根据今天是否节气日期得到返回索引MYNUMS_T solarTermIndex = 0;if (solardDay == solarTermDay){solarTermIndex = (solardDay>15) ? (solarMonth-1)*2 + 2 : (solarMonth-1)*2 + 1; } // 返回节气索引return solarTermIndex; }// 根据24节气值得到24节气字符串 const TCHAR* CDateConversion::GetSolarTermString(MYNUMS_T solarTermVal) {// 矫正索引MYNUMS_T realSolarTermVal = (solarTermVal<=24) ? solarTermVal : 0;return G_SOLAR_TERMS_STRING[realSolarTermVal]; }// 根据阳历日期得到24节气的字符串 const TCHAR* CDateConversion::GetSolarTermString(const MYDATE &solarDate) {return GetSolarTermString(GetSolarTerm(solarDate)); }// 根据阳历日期得到24节气的字符串 const TCHAR* CDateConversion::GetSolarTermString(MYYEAR_T solarYear, MYMONTH_T solarMonth, MYDAY_T solardDay) {return GetSolarTermString(GetSolarTerm(solarYear, solarMonth, solardDay)); }// // 根据公历年格式化到农历天干地支表示字符串,成功返回的是pLunarYearBuf指针,失败返回NULL const TCHAR* CDateConversion::FormatToLunarYear(MYYEAR_T solarYear, // 公历年份TCHAR *pLunarYearBuf, // 输出天干地支年表示字符串缓冲区MYNUMS_T cchBufLen // 缓冲区字符数长度) {// 参数有效性if (pLunarYearBuf==NULL || cchBufLen==0){return NULL;}// 定义天干字符串数组TCHAR *TIANGAN_STRING[] = {_T("甲"),_T("乙"),_T("丙"),_T("丁"),_T("戊"),_T("己"),_T("庚"),_T("辛"),_T("壬"),_T("癸")};// 定义地支字符串数组TCHAR *DIZHI_STRING[] = {_T("子"),_T("丑"),_T("寅"),_T("卯"),_T("辰"),_T("巳"),_T("午"),_T("未"),_T("申"),_T("酉"),_T("戌"),_T("亥")};// 定义生肖字符串数组TCHAR *SHENGXIAO_STRING[] = {_T("鼠"),_T("牛"),_T("虎"),_T("免"),_T("龙"),_T("蛇"),_T("马"),_T("羊"),_T("猴"),_T("鸡"),_T("狗"),_T("猪")};// 得到天干TCHAR szYearString[32] = {0};_tcscpy(szYearString, TIANGAN_STRING[(solarYear-4) % 10]);// 得到地支_tcscat(szYearString, DIZHI_STRING[(solarYear-4) % 12]);// 添加分割符_tcscat(szYearString, _T(" "));// 得到生肖_tcscat(szYearString, SHENGXIAO_STRING[(solarYear-4) % 12]);// 添加年_tcscat(szYearString, _T("年"));// 拷贝到输出缓冲区_tcsncpy(pLunarYearBuf, szYearString, cchBufLen-1);return pLunarYearBuf; }// 把农历月格式化为字符串,成功返回的是pLunarMonthBuf指针,失败返回NULL // 返回形如“八月” const TCHAR* CDateConversion::FormatLunarMonth(MYMONTH_T lunarMonth, // 农历月份 bool bLunarLeapMonth, // 是否农历闰月TCHAR *pLunarMonthBuf, // 输出月份字符串缓冲区MYNUMS_T cchBufLen // 缓冲区字符数长度(必须大于等于16)) {// 是否安全月份if (!BeSafeLunarMonth(lunarMonth)){return NULL;}// 参数有效性if (pLunarMonthBuf==NULL || cchBufLen==0){return NULL;}// 定义月字符串TCHAR *MONTH_STRING[] = {_T("正"),_T("二"),_T("三"),_T("四"),_T("五"),_T("六"),_T("七"),_T("八"),_T("九"),_T("十"),_T("十一"),_T("十二")};// 得到月串TCHAR szMonthString[32] = {0};if (bLunarLeapMonth && lunarMonth==1){_tcscpy(szMonthString, _T("一月"));}else{_tcscpy(szMonthString, MONTH_STRING[lunarMonth-1]);_tcscat(szMonthString, _T("月"));}// 拷贝到输出缓冲区_tcsncpy(pLunarMonthBuf, szMonthString, cchBufLen-1);return pLunarMonthBuf; }// 把农历日格式化为字符串,成功返回的是pLunarDayBuf指针,失败返回NULL // 返回形如“十四”或“初十” const TCHAR* CDateConversion::FormatLunarDay(MYDAY_T lunarDay, // 农历日期TCHAR *pLunarDayBuf, // 输出日期字符串缓冲区MYNUMS_T cchBufLen // 缓冲区字符数长度(必须大于等于16)) {// 是否有效的天if (lunarDay>30 || lunarDay<1){return NULL;}// 参数有效性if (pLunarDayBuf==NULL || cchBufLen==0){return NULL;}// 定义十位和个位字符串TCHAR *TEN_STRING[] = {_T("初"),_T("十"),_T("廿"),_T("三")};TCHAR *UNIT_STRING[] = {_T("一"),_T("二"),_T("三"),_T("四"),_T("五"),_T("六"),_T("七"),_T("八"),_T("九"),_T("十")};// 得到日期字符串TCHAR szDayString[32] = {0};if (lunarDay <= 10){_tcscpy(szDayString, TEN_STRING[(lunarDay-1)/10]);_tcscat(szDayString, UNIT_STRING[(lunarDay-1)%10]); } else if (lunarDay == 20){_tcscpy(szDayString, UNIT_STRING[1]);_tcscat(szDayString, UNIT_STRING[9]); }else{_tcscpy(szDayString, TEN_STRING[(lunarDay)/10]);_tcscat(szDayString, UNIT_STRING[(lunarDay-1)%10]); }// 拷贝到输出缓冲区_tcsncpy(pLunarDayBuf, szDayString, cchBufLen-1);return pLunarDayBuf; }

公元元年之后的天数与日期之间的相互转换 阳历日期转农历相关推荐

  1. java两个日期之间所有日期_java如何输出指定两个日期之间的所有日期

    java如何输出指定两个日期之间的所有日期 关注:252  答案:3  mip版 解决时间 2021-01-31 04:38 提问者等妳¬硪唯一鍀执念 2021-01-31 01:40 java如何输 ...

  2. PHP两个日期之间的所有日期

    我想得到两个日期之间的所有日期,  例如: 输入两个日期,把这两个日期之间的所有日期取出来       如果是:2005-02-01至2005-02-05(同为一个月)       则为:2005-0 ...

  3. java获取两个日期之间的所有日期(包括开始日期和结束日期)

    java获取两个日期之间的所有日期集合 解决方法: import java.text.SimpleDateFormat; import java.util.ArrayList; import java ...

  4. System.currentTimeMillis()与日期之间的相互转换

    System.currentTimeMillis()与日期 之间是可以相互转换的,大多数Android开发者都知道 通过 SimpleDateFormat dateformat = new Simpl ...

  5. java遍历两个日期_java 已知两个日期,遍历出两个日期之间所有的日期,重点是::包括第一个日期!!...

    哈哈,又是日期类问题,那我肯定建议你用Java8的新时间API了,而且你时间字符串还是这种格式yyyy-MM-dd,直接LocalDate.parse方法就可以把字符串转化为LocalDate对象了 ...

  6. java如何输出指定两个日期之间的所有日期

    引用:http://zhidao.baidu.com/link?url=swmihI3D6rISvViB1N9_bkuxkmajokhoW6cIvPBEux3BdB4WrgoDcrgdG25Mm9ln ...

  7. PHP 获取毫秒级别的时间戳,以及和日期之间的相互转换

    最近在写一个打卡的项目.结果发现"秒"已经不能满足这群小B的需求了,查了一些资料于是就有了这篇文章. public function index(){$msectime = $th ...

  8. HIVE列出两个日期之间的所有日期

    select tmp.*, t.*, date_add(start_date, pos) as mid_date from(select '1' as uid,'2020-07-01' as star ...

  9. php输出指定日期,PHP 输出两个指定日期之间的所有日期

    JavaScript的条件语句 JavaScript的条件语句 1.JavaScript的条件语句包括以下几个 (1)if - 只有当指定条件为true时,使用该语句来执行代码: (2)if...el ...

最新文章

  1. Postgresql:删除及查询字段中包含单引号的数据
  2. RUP within the context of the Six Best Practices
  3. Tri-Party Deep Network Representation
  4. 如何设计登录接口,十分钟内连续登录5次失败,需要等待30分钟才能登录
  5. localization of FreeBSD
  6. 变频器端子阻抗3k_PLC与变频器连接问题分析
  7. 为排序使用索引OrderBy优化
  8. CodeForces - 1400D Zigzags(简单dp)
  9. Linux安装cx_Oracles
  10. BZOJ1058 ZJOI2007 报表统计 线段树+平衡树
  11. Python(37)_字典嵌套
  12. 想赚钱,需要脑袋能开窍
  13. azure 入门_Azure Function应用程序入门
  14. win10升级后ctrl+shift+f失效了(zend studio)问题解决
  15. 持续交付和DevOps是一对好基友
  16. win10专业版和企业版的区别_Win10专业版和家庭版有什么区别?
  17. 易优CMS插件易优CMS智能改写插件
  18. 【教程】如何使用ArcGIS绘制荧光图
  19. oracle配置话清单,oracle 几个常用话语
  20. I2C详解(3) I2C总线的规范以及用户手册(2) I2C其他的总线协议以及总线速度

热门文章

  1. 4种快速易用的Python数据可视化方法
  2. 买书到底上哪个网站,china-pub,当当,京东
  3. 20个Python 3实战项目源代码,助你快速提升编程技能!
  4. focusky如何转成html,Focusky怎样更改交互动作 Focusky交互动作更改办法
  5. 屏占比超越100%?努比亚六周年大秀黑科技
  6. win32API函数
  7. 动态调整ConstaintLayout元素位置
  8. FL Studio 20 Getting Started Manual
  9. 关于Office2010与Office2016的共存问题
  10. 【头歌】重生之我在py入门实训中(1)