农历类==解析指定的日期 1900-2100

来源:互联网 发布:java判断浏览器类型 编辑:程序博客网 时间:2024/06/04 19:55

/*

*  Gregorian Solar Calendar and Chinese Lunar Calendar

*  农历; 阳历; 阴历; 节日; 时区; 节气; 干支; 生肖

*  1900-2100 超酷万年历

*  本类作者:webmote 2006-09 参考自互联网流行的 1900-2100 超酷万年历,并修改了一部分BUG

*  有任何问题,请email luo31@yahoo.com.cn

*  !!!!引用本类,请不要删除此段注释!!!!

*/

#pragma once

 

class CLunar

{

public:

   CLunar(void);

   ~CLunar(void);

 

public:

 

 

   //农历

   int     m_lYear;    //公元年4位数字

   int     m_lMonth;   //农历月数字

   int     m_lDay;     //农历日数字

   CString m_cYearName; //年号纪年表示

   CString m_cWordDay; //文字表示的日期

   CString m_cMonthSB; //月大 小?

   BOOL    m_isLeap;  //是否为农历闰月?

   //八字

   CString m_cYear;   //年柱, 2个中文

   CString m_cMonth;  //月柱, 2个中文

   CString m_cDay;    //日柱, 2个中文

   CString m_cAnimal; //动物属相

 

   //节日

   CString m_lunarFestival; //农历节日

   CString m_solarFestival; //公历节日

   CString m_solarTerms;    //节气

 

   BOOL    m_bStrong;       //强调的节日 放假日

 

/************************************************************************/

   /* 计算农历日期                                                         */

/************************************************************************/

   //计算农历

   void Lunar(COleDateTime tmMeas);

private:

/************************************************************************/

   /* []历所使用的全局常量                                                 */

/************************************************************************/

   // 日期资料

   static const int m_lunarInfo[]; //农历日期

   static const CString m_GAN[]; //天干

   static const CString m_ZHI[]; //地支

   static const CString m_Animals[]; //生肖

   static const CString m_nStr1[]; //数字的中文描述

   static const CString m_nStr2[]; //数字的中文描述

 

   //农历节日

   static const CString m_lFtv[];

 

/************************************************************************/

   /* []历所使用的全局常量                                                 */

/************************************************************************/

   static const int m_solarMonth[];    //月的天数

   static const CString m_solarTerm[];   //节气的中文描述

   static const int     m_sTermInfo[]; //节气的日期信息

   static const CString m_monthName[]; //月的英文描述

 

   //公历节日 *表示放假日

   static const CString m_sFtv[];

   //某月的第几个星期几。 5,6,7,8 表示到数第 1,2,3,4 个星期几

   static const CString m_wFtv[];

 

   //检测时间

   COleDateTime  m_tmMeas; //检测日期

 

 

private:

 

   //返回农历 y年的总天数

   int getYearDays(int y);

   //返回农历 y年闰月的天数

   int getLeapDays(int y);

   //返回农历 y年闰哪个月 1-12 , 没闰返回 0

   int getLeapMonth(int y);

   //返回农历 ym月的总天数

   int getMonthDays(int y,int m);

 

   //某年的第n个节气为几日(0小寒起算)

   int getSTerm(int y,int n);

   //得到农历天的描述

   CString getWordDay(int d);

   //得到年号纪年 描述

   CString getYearName(int y);

 

   //得到干支纪年

   CString getGZ(LONGLONG num);

   //从节日字符里解析出数字,描述,*

   void parseFtv(CString strInfo,int& nFirst,int& nLast,CString& strDesc,BOOL& bStrong);

 

   //得到当日为本月的第几周

   int getWeekOfMonth(int y,int m,int d);

 

   //得到当月有几周

   int getWeeksOfMonth(int y,int m);

 

   //计算指定年代与 UTC时间相差的 100ns

   LONGLONG getUTC(int nYear,

      int nMonth,

      int nDay,

      int nHour=0,

      int nMin=0,

      int nSec=0);

 

};

 

 

CPP文件

 

#include "StdAfx.h"

#include "./lunar.h"

#include <math.h>

 

//数组存入阴历1900年到2100年每年中的月天数信息, 

//阴历每月只能是2930天,一年用12(或13)个二进制位表示,对应位为130天,否则为29 

const int CLunar::m_lunarInfo[]={ //农历日期信息

   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

};

const CString CLunar::m_GAN[]={ //天干

   _T(""),_T(""),_T(""),_T(""),_T(""),_T(""),_T(""),_T(""),

      _T(""),_T("")

};

const CString CLunar::m_ZHI[]={ //地支

   _T(""),_T(""),_T(""),_T(""),_T(""),_T(""),_T(""),_T(""),

      _T(""),_T(""),_T(""),_T("") 

};

const CString CLunar::m_Animals[]={ //生肖

   _T(""),_T(""),_T(""),_T(""),_T(""),_T(""),_T(""),_T(""),

      _T(""),_T(""),_T(""),_T("")

};

const CString CLunar::m_nStr1[]={ //数字的中文描述

   _T(""),_T(""),_T(""),_T(""),_T(""),_T(""),_T(""),_T(""),

      _T(""),_T(""),_T("")

};

const CString CLunar::m_nStr2[]={ //数字的中文描述

   _T(""),_T(""),_T("廿"),_T(""),_T("")

};

const int CLunar::m_solarMonth[]={    //月的天数

   31,28,31,30,31,30,31,31,30,31,30,31

};

const CString CLunar::m_solarTerm[]={   //节气的中文描述

   _T("小寒"),_T("大寒"),_T("立春"),_T("雨水"),_T("惊蛰"),_T("春分"),_T("清明"),

      _T("谷雨"),_T("立夏"),_T("小满"),_T("芒种"),_T("夏至"),_T("小暑"),_T("大暑"),

      _T("立秋"),_T("处暑"),_T("白露"),_T("秋分"),_T("寒露"),_T("霜降"),_T("立冬"),

      _T("小雪"),_T("大雪"),_T("冬至")

};

const int CLunar::m_sTermInfo[]={ //节气的日期信息

0,21208,42467,63836,85337,107014,128867,150921,173149,195551,218072,240693,

   263343,285989,308563,331033,353350,375494,397447,419210,440795,462224,483532,

      504758

};

const CString CLunar::m_monthName[]={ //月的英文描述

_T("JAN"),_T("FEB"),_T("MAR"),_T("APR"),_T("MAY"),_T("JUN"),_T("JUL"),_T("AUG"),

      _T("SEP"),_T("OCT"),_T("NOV"),_T("DEC")

};

 

const CString CLunar::m_sFtv[]={ //公历节日 *表示放假日

   _T("0101*新年元旦"),

      _T("0202 世界湿地日"),

      _T("0207 国际声援南非日"),

      _T("0210 国际气象节"),

      _T("0214 情人节"),

      _T("0301 国际海豹日"),

      _T("0303 全国爱耳日"),

      _T("0308 国际妇女节"),

      _T("0312 植树节 孙中山逝世纪念日"),

      _T("0314 国际警察日"),

      _T("0315 国际消费者权益日"),

      _T("0317 中国国医节 国际航海日"),

      _T("0321 世界森林日 消除种族歧视国际日"),

      _T("0321 世界儿歌日"),

      _T("0322 世界水日"),

      _T("0323 世界气象日"),

      _T("0324 世界防治结核病日"),

      _T("0325 全国中小学生安全教育日"),

      _T("0330 巴勒斯坦国土日"),

      _T("0401 愚人节 全国爱国卫生运动月(四月) 税收宣传月(四月)"),

      _T("0407 世界卫生日"),

      _T("0422 世界地球日"),

      _T("0423 世界图书和版权日"),

      _T("0424 亚非新闻工作者日"),

      _T("0501 国际劳动节"),

      _T("0504 中国五四青年节"),

      _T("0505 碘缺乏病防治日"),

      _T("0508 世界红十字日"),

      _T("0512 国际护士节"),

      _T("0515 国际家庭日"),

      _T("0517 世界电信日"),

      _T("0518 国际博物馆日"),

      _T("0520 全国学生营养日"),

      _T("0523 国际牛奶日"),

      _T("0531 世界无烟日"),

      _T("0601 国际儿童节"),

      _T("0605 世界环境日"),

      _T("0606 全国爱眼日"),

      _T("0617 防治荒漠化和干旱日"),

      _T("0623 国际奥林匹克日"),

      _T("0625 全国土地日"),

      _T("0626 国际反毒品日"),

      _T("0701 中国共产党建党日 世界建筑日"),

      _T("0702 国际体育记者日"),

      _T("0707 中国人民抗日战争纪念日"),

      _T("0711 世界人口日"),

      _T("0730 非洲妇女日"),

      _T("0801 中国建军节"),

      _T("0808 中国男子节(爸爸节)"),

      _T("0815 日本正式宣布无条件投降日"),

      _T("0908 国际扫盲日 国际新闻工作者日"),

      _T("0910 教师节"),

      _T("0914 世界清洁地球日"),

      _T("0916 国际臭氧层保护日"),

      _T("0918 九·一八事变纪念日"),

      _T("0920 国际爱牙日"),

      _T("0927 世界旅游日"),

      _T("1001*国庆节 世界音乐日 国际老人节"),

      _T("1001 国际音乐日"),

      _T("1002 国际和平与民主自由斗争日"),

      _T("1004 世界动物日"),

      _T("1008 全国高血压日"),

      _T("1008 世界视觉日"),

      _T("1009 世界邮政日 万国邮联日"),

      _T("1010 辛亥革命纪念日 世界精神卫生日"),

      _T("1013 世界保健日 国际教师节"),

      _T("1014 世界标准日"),

      _T("1015 国际盲人节(白手杖节)"),

      _T("1016 世界粮食日"),

      _T("1017 世界消除贫困日"),

      _T("1022 世界传统医药日"),

      _T("1024 联合国日 世界发展信息日"),

      _T("1031 世界勤俭日"),

      _T("1107 十月社会主义革命纪念日"),

      _T("1108 中国记者日"),

      _T("1109 全国消防安全宣传教育日"),

      _T("1110 世界青年节"),

      _T("1111 国际科学与和平周(本日所属的一周)"),

      _T("1112 孙中山诞辰纪念日"),

      _T("1114 世界糖尿病日"),

      _T("1117 国际大学生节 世界学生节"),

      _T("1121 世界问候日 世界电视日"),

      _T("1129 国际声援巴勒斯坦人民国际日"),

      _T("1201 世界艾滋病日"),

      _T("1203 世界残疾人日"),

      _T("1205 国际经济和社会发展志愿人员日"),

      _T("1208 国际儿童电视日"),

      _T("1209 世界足球日"),

      _T("1210 世界人权日"),

      _T("1212 西安事变纪念日"),

      _T("1213 南京大屠杀(1937)纪念日!紧记血泪史!"),

      _T("1221 国际篮球日"),

      _T("1224 平安夜"),

      _T("1225 圣诞节"),

      _T("1229 国际生物多样性日")

};

const CString CLunar::m_wFtv[]={//某月的第几个星期几。 5,6,7,8 表示到数第 1,2,3,4 个星期几

   _T("0110 黑人日"),

      _T("0150 世界麻风日"), //一月的最后一个星期日(月倒数第一个星期日)

      _T("0520 国际母亲节"),

      _T("0530 全国助残日"),

      _T("0630 父亲节"),

      _T("0911 劳动节"),

      _T("0932 国际和平日"),

      _T("0940 国际聋人节 世界儿童日"),

      _T("0950 世界海事日"),

      _T("1011 国际住房日"),

      _T("1013 国际减轻自然灾害日(减灾日)"),

      _T("1144 感恩节")

};

const CString CLunar::m_lFtv[]={//农历节日

   _T("0101*春节"),

      _T("0115 元宵节"),

      _T("0202 龙抬头节"),

      _T("0323 妈祖生辰 (天上圣母诞辰)"),

      _T("0505 端午节"),

      _T("0707 七七中国情人节"),

      _T("0815 中秋节"),

      _T("0909 重阳节"),

      _T("1208 腊八节"),

      _T("1224 小年"),

      _T("1200*除夕")

};

 

CLunar::CLunar(void)

{

   m_lYear=0;    //公元年4位数字

   m_lMonth=0;   //农历月数字

   m_lDay=0;     //农历日数字

   m_isLeap=FALSE;  //是否为农历闰月?

   //八字

   m_cYear=_T("");   //年柱, 2个中文

   m_cMonth=_T("");  //月柱, 2个中文

   m_cDay=_T("");    //日柱, 2个中文

   m_cAnimal=_T(""); //动物属相

 

   //节日

   m_lunarFestival=_T(""); //农历节日

   m_solarFestival=_T(""); //公历节日

   m_solarTerms=_T("");    //节气

 

   m_bStrong=FALSE;       //强调的节日

 

}

 

CLunar::~CLunar(void)

{

}

 

//返回农历 y年的总天数

int CLunar::getYearDays(int y)

{

   int i=0, sum = 348;

   for(i=0x8000; i>0x8; i>>=1)

      sum += (m_lunarInfo[y-1900] & i)? 1: 0;

   return(sum+getLeapDays(y));

 

}

//返回农历 y年闰月的天数

int CLunar::getLeapDays(int y)

{

   if(getLeapMonth(y))

      return((m_lunarInfo[y-1899]&0xf)==0xf? 30: 29);

   else

      return(0);

 

}

//返回农历 y年闰哪个月 1-12 , 没闰返回 0

int CLunar::getLeapMonth(int y)

{

   int lm = m_lunarInfo[y-1900] & 0xf;

   return(lm==0xf?0:lm);

 

}

//返回农历 ym月的总天数

int CLunar::getMonthDays(int y,int m)

{

   return((m_lunarInfo[y-1900] & (0x10000>>m))? 30: 29 );

 

}

 

// 传入 offset 返回干支, 0=甲子

// 年柱 1900年立春后为庚子年(60进制36)

//cyclical(SY-1900+36) + '年 【'+Animals[(SY-4)%12]+'年】

CString CLunar::getGZ(LONGLONG num) {

   return m_GAN[num%10] + m_ZHI[num%12];

}

//某年的第n个节气为几日(0小寒起算)

int CLunar::getSTerm(int y,int n)

{

   LONGLONG lUtc1=-22085493000000000; //1900,1,6,2,5,0  unit:100ns

   LONGLONG lUtc2=-116444736000000000; //1601,1,1,0,0,0  unit:100ns

 

   ULONGLONG lDate=315569259747000;

   lDate *= (y-1900);

   lDate += UInt32x32To64(600000000,m_sTermInfo[n]);

   lDate += lUtc1; //100ns--->ms

   //TRACE("ldate= %I64d/n",lDate);

   lDate -=lUtc2;

   SYSTEMTIME st;

   FileTimeToSystemTime((FILETIME*)&lDate,&st);

   //COleDateTime tmRet(st);

   return st.wDay;

}

void CLunar::Lunar(COleDateTime tmMeas)

{

   m_tmMeas=tmMeas;

   int i, leap=0, temp=0;

 

   //COleDateTime tmConst(1900,1,31,m_tmMeas.GetHour(),m_tmMeas.GetMinute(),m_tmMeas.GetSecond());

   //COleDateTimeSpan tmSpan=m_tmMeas-tmConst;

   //int offset2=static_cast<int>(floor(tmSpan.GetTotalDays()));

   int y = m_tmMeas.GetYear();

   int m = m_tmMeas.GetMonth();

   int d = m_tmMeas.GetDay();

 

   ASSERT(y>1899 && y<2101);

   m_cYearName=getYearName(y);

   int offset=static_cast<int>(getUTC(y,m,d)/864000000000 - getUTC(1900,1,31)/864000000000);

   for(i=1900; i<2100 && offset>0; i++) { temp=getYearDays(i); offset-=temp; }

 

   if(offset<0) { offset+=temp; i--; }

 

   m_lYear = i;

 

   leap = getLeapMonth(i); //闰哪个月

   m_isLeap = FALSE;

 

   for(i=1; i<13 && offset>0; i++) {

      //闰月

      if(leap>0 && i==(leap+1) && (!m_isLeap))

      { --i; m_isLeap = TRUE; temp = getLeapDays(m_lYear); }

      else

      { temp = getMonthDays(m_lYear, i); }

 

      //解除闰月

      if(m_isLeap==TRUE && i==(leap+1)) m_isLeap = FALSE;

 

      offset -= temp;

   }

 

   if(offset==0 && leap>0 && i==leap+1)

   {

      if(m_isLeap)

      {

        m_isLeap = FALSE;

      }

      else

      {

        m_isLeap = TRUE;

        --i;

      }

   }

 

   if(offset<0){

      offset += temp;

      --i;

   }

   m_lMonth = i;

   m_lDay = offset + 1;

   m_cWordDay= getWordDay(m_lDay);

   m_cMonthSB=((m_isLeap?getLeapDays(m_lYear):getMonthDays(m_lYear,m_lMonth))>29)?_T(""):_T("");

 

 

//////////////////////////////////////////////////////////////////////////

   //初始化 八字

 

   //36 年一循环

   ////////年柱 1900年立春后为庚子年(60进制36)

   m_cAnimal=m_Animals[(m_lYear-4)%12];

   m_cYear=getGZ(m_lYear-1900+36);

   ///////月柱 19001月小寒以前为丙子月(60进制12)

   //m_cMonth= getGZ((y-1900)*12+m+12);

   m_cMonth= getGZ((m_lYear-1900)*12+m_lMonth+1+12);

 

   //当月一日与 1900/1/1 相差天数

   //1900/1/1 1970/1/1 相差25567, 1900/1/1 日柱为甲戌日(60进制10)

   LONGLONG dayCyclical = getUTC(y,m,d)/864000000000+25567+10;

   m_cDay= getGZ(dayCyclical);

 

//////////////////////////////////////////////////////////////////////////

   //初始化 节日

   //公历节气

   int nMSterm=getSTerm(y,(m-1)*2);

   if(d==getSTerm(y,(m-1)*2))

      m_solarTerms=m_solarTerm[(m-1)*2];

   else if(d==getSTerm(y,(m-1)*2+1))

      m_solarTerms=m_solarTerm[(m-1)*2+1];

   else

      m_solarTerms=_T("");

 

   //公历节日

   m_solarFestival=_T("");

   m_bStrong=FALSE;

   int nFtvM=0,nFtvD=0;

   CString strDesc;

   BOOL bStrong;

   for(int i=0;i<sizeof(m_sFtv)/sizeof(m_sFtv[0]);i++)

   {

      parseFtv(m_sFtv[i],nFtvM,nFtvD,strDesc,bStrong);

      if(m==nFtvM && d==nFtvD)

      {

        if(!m_solarFestival.IsEmpty())

           m_solarFestival+=_T(" ");

        m_solarFestival+=strDesc;

        m_bStrong=bStrong;  

      }

   }

 

   //月周节日

   int nWeekNo=0,nWeekDay=0; //第几周,星期几

   for(int i=0;i<sizeof(m_wFtv)/sizeof(m_wFtv[0]);i++)

   {

      parseFtv(m_wFtv[i],nFtvM,nFtvD,strDesc,bStrong);

      nWeekNo=nFtvD/10;nWeekDay=nFtvD%10; //0--星期日

      if((m==nFtvM) && (m_tmMeas.GetDayOfWeek()-1)==nWeekDay )  

      {

        if((nWeekNo<6 && (getWeekOfMonth(y,m,d)==nWeekNo)) ||

           (nWeekNo>=6 && ((getWeeksOfMonth(y,m)-getWeekOfMonth(y,m,d)+6)==nWeekNo)))

        {

           if(!m_solarFestival.IsEmpty())

              m_solarFestival+=_T(" ");

           m_solarFestival+=strDesc;

           m_bStrong=(m_bStrong?TRUE:bStrong);

        }

      }

   }

 

   //黑色星期五

   COleDateTime tmFirst(y,m,13,1,0,0);  //13号是不是星期五

   if(tmFirst.GetDayOfWeek()==6)

   {

      if(!m_solarFestival.IsEmpty())

        m_solarFestival+=_T(" ");

      m_solarFestival+=_T(" 黑色星期五");;

   }

 

   //复活节只出现在34月 复活节日举行此盛会的日子,这个日子是321日或其后月满之后的第一个星期天

   //if(m==3 || m==4) {

   // var estDay = new easter(y);

   // if(m == estDay.m)

   //  ' 复活节 Easter Sunday';

   //}

 

 

   //农历节日

   m_lunarFestival=_T("");

   for(int i=0;i<sizeof(m_lFtv)/sizeof(m_lFtv[0]);i++)

   {

      parseFtv(m_lFtv[i],nFtvM,nFtvD,strDesc,bStrong);

      if((m_lMonth==nFtvM && m_lDay==nFtvD) ||

        (m_lMonth==nFtvM && nFtvD==0 &&  (m_isLeap?getLeapDays(m_lYear):getMonthDays(m_lYear,m_lMonth))==m_lDay)) //最后一天,用0标示

      {

        m_lunarFestival=strDesc;

        m_bStrong=(m_bStrong?TRUE:bStrong);

      } 

   }

}

 

 

}

LONGLONG CLunar::getUTC(int nYear,

                 int nMonth,

                 int nDay,

                 int nHour,

                 int nMin,

                 int nSec )

{

   // 计算指定年代与 UTC时间相差的 数

   //此段代码 联系 webmote

   LONGLONG lValue=10000

      return lValue;

}

 

void CLunar::parseFtv(CString strInfo,int& nFirst,int& nLast,CString& strDesc,BOOL& bStrong)

{

   CString sInfo(strInfo);

   sInfo.TrimLeft();

   sInfo.TrimRight();

   if(sInfo.IsEmpty())

      return;

 

   CString sFirstNum,sLastNum;

   sFirstNum=sInfo.Left(2);

   sLastNum=sInfo.Mid(2,2);

   nFirst=atoi(sFirstNum.GetBuffer(2));

   nLast=atoi(sLastNum.GetBuffer(2));

   sFirstNum.ReleaseBuffer();

   sLastNum.ReleaseBuffer();

 

   CString sStrong=sInfo.Mid(4,1);

   if(sStrong==_T("*"))

      bStrong=TRUE;

   else

      bStrong=FALSE;

 

   strDesc=sInfo.Mid(5);

   strDesc.TrimLeft();

}

int CLunar::getWeekOfMonth(int y,int m,int d)

{

   COleDateTime tm(y,m,1,1,0,0);

   COleDateTime tmCurr(y,m,d,1,0,0);

   int nSpanDays=d-1;

   int nWeekSpan=nSpanDays/7+1;

   int nWeekDay=tm.GetDayOfWeek()+nSpanDays%7;

   if(nWeekDay>7)

   {

      nWeekDay-=7;

      nWeekSpan++;

   }

   TRACE("week=%d/n",nWeekDay);

   return nWeekSpan;

}

int CLunar::getWeeksOfMonth(int y,int m)

{

   //计算当月天数

   int nMonths=0;

   static int cDaysInMonth[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

   nMonths=cDaysInMonth[m-1];

   if(y % 100 != 0 && y % 4 == 0)

   {

      if(m==2)

        nMonths += 1;

   }

   return getWeekOfMonth(y,m,nMonths);

}

//中文日期

CString  CLunar::getWordDay(int d){

   CString s;

   switch (d) {

   case 10:

      s = _T("初十");

      break;

   case 20:

      s = _T("二十");

      break;

   case 30:

      s = _T("三十");

      break;

   default :

      s = m_nStr2[d/10];

      s += m_nStr1[d%10];

   }

   return s;

}

//年号

CString CLunar::getYearName(int y)

{

   CString cYear,cTmp;

   if(y>1874 && y<1909)  //光绪

   {

      (y-1874==1)?cTmp=_T(""):cTmp.Format(_T("%d"),y-1874);

      cYear.Format(_T("光绪%s"),cTmp);

   }

   else if(y>1908 && y<1912)  //宣统

   {

      (y-1908==1)?cTmp=_T(""):cTmp.Format(_T("%d"),y-1908);

      cYear.Format(_T("宣统%s"),cTmp);

   }

   else if(y>1911 && y<1950) //民国

   {

      (y-1911==1)?cTmp=_T(""):cTmp.Format(_T("%d"),y-1911);

      cYear.Format(_T("民国%s"),cTmp);

   }

   else if(y>1949)           //共和国

   {

      (y-1949==1)?cTmp=_T(""):cTmp.Format(_T("%d"),y-1949);

      cYear.Format(_T("共和国%s"),cTmp);

   }

   else

      cYear.Format(_T("公元%d"),y);

   return cYear;

}

原创粉丝点击