Date类实现

本文介绍了一个日期类的设计与实现细节,包括日期的基本操作如加减运算、转换为字符串等,以及高级功能如判断闰年、获取星期几、转换阳历与农历、获取中国节气等。此外还提供了主函数测试示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

头文件:
#include<string>
#include<vector>
using namespace std;

class Date
{
private:
	int year,month,day;
	int lunar_year,lunar_month,lunar_day;
	string LunarHolDay;
public:
	int get_y(){return year;}
	int get_m(){return month;}
	int get_d(){return day;}
	int get_lunar_year(){return lunar_year;}
	int get_lunar_month(){return lunar_month;}
	int get_lunar_day(){return lunar_day;}
	string get_str(){return LunarHolDay;}//返回节气
	Date();    //构造函数 
	Date(const Date &b);//拷贝构造函数
	Date(int y,int m,int d);//构造函数
	int dis_days(Date &a);// 间隔天数
	Date operator+(int v);// 日期与数字加
	Date operator-(int v);// 日期与数字减
	int get_weeks();// 返回星期几
	static Date get_today();// 今天
	bool Isleap(Date &a);// 判断闰年
	void display()const ;//显示日期
	void solar_lunar();// 阳历转农历
	void GetLunarHolDay();// 取得中国节气
	bool operator <(Date &b);// 重载操作符,用于排序
	void operator=(Date &b);
	string toString();//格式化输出 默认yyyy-mm-dd
	static vector<Date> get_holday(string str);//中国法定节日
};

类函数的实现:

#include"Date.h"
#include<Windows.h>
#include<time.h>
#include<stdio.h>
#include<vector>
#include<sstream>
#include<iostream>
typedef unsigned short WORD;
typedef unsigned char BYTE;
Date::Date(int y,int m,int d)//构造函数
{
	year=y;month=m;day=d;
	LunarHolDay="";
}
Date::Date()
{
	Date d=Date::get_today();
	year=d.get_y();month=d.get_m();day=d.get_d();
	LunarHolDay="";
}
Date::Date(const Date& b)
{
	this->year=b.year;
	this->month=b.month;
	this->day=b.day;
}
bool Isleap(int year)
{
	return (year % 4 == 0 &&year % 100 || year % 400 == 0);
}
int Date::get_weeks()//星期几
{
	int mo=month,dd=day,ye=year;
	if(mo==1||mo==2){
		mo+=12;
		ye--;
	}
	int k=(dd+2*mo+3*(mo+1)/5+ye+ye/4-ye/100+ye/400)%7;  
	return k;
}
int DayOfMonth(Date &a)
{
	int d=0,m=a.get_m();
	switch(m)
	{
	case 1:
	case 3:
	case 5:
	case 7:
	case 8:
	case 10:
	case 12:
		d=31;
		break;
	case 4:
	case 6:
	case 9:
	case 11:
		d=30;
		break;
	case 2:
		d=28;
		if(Isleap(a.get_y ()))
			d++;
		break;
	}
	return d;
}
Date Date::operator+(int v)
{
	Date d=*this;
	if(v==0) return d;
	if(v>0)
	{
		d.day+=v;
		while(d.day >DayOfMonth(d)){
			d.day-=DayOfMonth(d );
			d.month++;
			if(d.month >12) {
				++d.year;
				d.month =1;
			}
		}
		return d;
	}
	else return d-(-v);
}
Date Date::operator-(int v)
{
	Date d=*this;
	if(v==0) return d;
	if(v>0)
	{
		d.day -=v;
		while(d.day <=0){
			--d.month ;
			if(d.month ==0){
				d.month=12;
				--d.year ;
			}
			d.day +=DayOfMonth(d);
		}
		return d;
	}
	else return d+(-v);
}
void Date::operator=(Date &b)
{
	year=b.year;
	month=b.month;
	day=b.day;
}
int sum(Date &a){
    int md[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
	int cnt = a.get_y() * 365;
	cnt += (a.get_y() - 1) / 4 + 1;
    cnt -= (a.get_y() - 1) / 100 + 1;
    cnt += (a.get_y() - 1) / 400 + 1;
    for(int i = 1; i < a.get_m(); ++i) cnt += md[i];
    if(a.get_m() > 2 && Isleap(a.get_y ())) ++cnt;
    cnt += a.get_d();
    return cnt;
}
int Date::dis_days(Date &a)//日期相减
{
	 int d= sum(*this)-sum(a);
	 if(d<0) d*=-1;
	 return d;
}
Date Date::get_today()
{
	SYSTEMTIME sys;
	GetLocalTime(&sys);
	Date a(sys.wYear,sys.wMonth,sys.wDay);
	return a;
}
void Date::display() const 
{
	printf("%d-%d-%d",year,month,day);
}

long int lunar_info[]=  
{  
    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,0x0a5b0,0x14573,0x052b0,0x0a9a8,0x0e950,0x06aa0,  
    0x0aea6,0x0ab50,0x04b60,0x0aae4,0x0a570,0x05260,0x0f263,0x0d950,0x05b57,0x056a0,  
    0x096d0,0x04dd5,0x04ad0,0x0a4d0,0x0d4d4,0x0d250,0x0d558,0x0b540,0x0b6a0,0x195a6,  
    0x095b0,0x049b0,0x0a974,0x0a4b0,0x0b27a,0x06a50,0x06d40,0x0af46,0x0ab60,0x09570,  //1980  
    0x04af5,0x04970,0x064b0,0x074a3,0x0ea50,0x06b58,0x055c0,0x0ab60,0x096d5,0x092e0,  
    0x0c960,0x0d954,0x0d4a0,0x0da50,0x07552,0x056a0,0x0abb7,0x025d0,0x092d0,0x0cab5,  //2004 07552  
    0x0a950,0x0b4a0,0x0baa4,0x0ad50,0x055d9,0x04ba0,0x0a5b0,0x15176,0x052b0,0x0a930,  
    0x07954,0x06aa0,0x0ad50,0x05b52,0x04b60,0x0a6e6,0x0a4e0,0x0d260,0x0ea65,0x0d530, //2028  
    0x05aa0,0x076a3,0x096d0,0x04bd7,0x04ad0,0x0a4d0,0x1d0b6,0x0d250,0x0d520,0x0dd45,  
    0x0b5a0,0x056d0,0x055b2,0x049b0,0x0a577,0x0a4b0,0x0aa50,0x1b255,0x06d20,0x0ada0,  
    0x14b63  
};  
unsigned char get_leap_month(unsigned int lunar_year) //确定是否存在农历的闰月 并返回闰月
{ 
    return lunar_info[lunar_year-1900]&0xf;
}
//---------------------------------------------
unsigned char get_leap_month_day(unsigned int lunar_year)  //若存在闰月,返回闰月的天数,30?29
{ 
    if(get_leap_month(lunar_year))
        return(  ( (lunar_info[lunar_year-1900]) & 0x10000 ) ? 30:29 );
    else
        return(0);
}
//---------------------------------------------
unsigned char get_lunar_month_total(unsigned int lunar_year, unsigned char lunar_month) //确定农历当月天数,30?29
{
    return( (lunar_info[lunar_year-1900] & (0x10000>>lunar_month) ) ? 30:29 );
} 
//---------------------------------------------
unsigned int get_lunar_year_total(unsigned int lunar_year) // 农历当年总天数,354?355 384 383
 { 
    /*sum=12*29 */   //12个月 29天一月
    unsigned int sum=348;
    unsigned int i;
     for(i=0x8000;i>0x8; i>>=1) 
         sum+=(lunar_info[lunar_year-1900]&i)?1:0;  //把大月的1加进去
    return(sum+get_leap_month_day(lunar_year));    //判断这年是否有闰月
 }

unsigned int leap(unsigned int year)  //判断是否为闰年
{ 
    if( (year%4==0 &&year%100!=0) || year%400==0 )
        return 366; 
    else
        return 365; 
}

//--------------------------------------
unsigned char day(unsigned int year ,unsigned char month) //判断当年当月天数
{ 
    if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
        return 31;
    if(month==4||month==6||month==9||month==11)
        return 30; 
    if(month==2&&leap(year)==366)
        return 29;
    else
        return 28; 
}
//-------------------------------------------
//计算1900.1.1 到  输入年月的天数
unsigned int get_solar_total(unsigned int solar_year, unsigned char solar_month)
{ 
    unsigned int total;
    unsigned int temp_num;
    total=0;
    for(temp_num=1900;temp_num<solar_year;temp_num++)
        total+=leap(temp_num);
    for(temp_num=1;temp_num<solar_month;temp_num++)
        total+=day(solar_year,temp_num);
    return total;
}
string SolarTerm[25]={ "小寒", "大寒", "立春", "雨水", "惊蛰", "春分", "清明", "谷雨", "立夏", "小满", "芒种", 
	"夏至", "小暑", "大暑", "立秋", "处暑", "白露", "秋分", "寒露", "霜降", "立冬", "小雪", "大雪", "冬至" };
int sTermInfo[25]={ 0, 21208, 42467, 63836, 85337, 107014, 128867, 150921, 173149, 195551, 218072, 240693, 263343, 
	285989, 308563, 331033, 353350, 375494, 397447, 419210, 440795, 462224, 483532, 504758 };
void Date::solar_lunar()
{
    unsigned int total_day=0;/*记录农历1900.1.1日到今天相隔的天数 */
    unsigned char run_yue_flag=0,run_yue=0,year_flag=0;
	int lunar_year,lunar_month,lunar_day;
	int kp_year=this->year ,kp_month=this->month ,kp_day=this->day ;

    total_day=get_solar_total( kp_year, kp_month)+kp_day-30; /* 阳历从1900.1.31(农历1900.1.1)到今天的总天数(减30 实际少了一天)。 */
    lunar_year=1900;
    while(total_day>385) //385大于一年  留出一年多的时间用于条件计算
    {
        total_day-=get_lunar_year_total(lunar_year); //
        lunar_year++;
    }
    if(total_day>get_lunar_year_total(lunar_year))  //排除lunar_year有闰月的情况
    {
        total_day-=get_lunar_year_total(lunar_year);
        lunar_year++;

    }
    run_yue=get_leap_month(lunar_year);  //当前闰哪个月
	cout<<"Run  "<<(run_yue ? 1:0)<<endl;
    if(run_yue)
        run_yue_flag=1; //有闰月则一年为13个月
    else
        run_yue_flag=0;  //没闰月则一年为12个月
    if(total_day==0)   //刚好一年
    {
        lunar_day=get_lunar_month_total(lunar_year,12);
        lunar_month=12;
    }
    else
    {
        lunar_month=1;
        while(lunar_month<=12)
        {
                if( run_yue_flag==1 && lunar_month==(run_yue+1) )  //闰月处理
                {
                        if(total_day>get_leap_month_day(lunar_year))
                        {
                            total_day-=get_leap_month_day(lunar_year);  //该年闰月天数

                        }
                         //lunar_month--;
                         run_yue_flag=0;
                         continue;

                }
                if( total_day> get_lunar_month_total(lunar_year,lunar_month ) )
                {
                        total_day=total_day-get_lunar_month_total(lunar_year,lunar_month);  //该年该月天数
                        lunar_month++;
                }
                else
                {
                    lunar_day=total_day;
                    break;
                }
        }
    }
	this->lunar_year=lunar_year;
	this->lunar_month=lunar_month;
	this->lunar_day=lunar_day;
}
BYTE gLunarHolDay[]=    
{    
      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,   //2003    
      0X96, 0XB4, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X86,   //2004    
      0XA5, 0XB3, 0XA5, 0XA5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87,   //2005    
      0XA5, 0XB4, 0X96, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87,   //2006    
      0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X69, 0X78, 0X87,   //2007    
      0X96, 0XB4, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X87, 0X78, 0X87, 0X86,   //2008    
      0XA5, 0XB3, 0XA5, 0XB5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87,   //2009    
      0XA5, 0XB4, 0X96, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87,   //2010    
      0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X79, 0X78, 0X87,   //2011    
      0X96, 0XB4, 0XA5, 0XB5, 0XA5, 0XA6, 0X87, 0X88, 0X87, 0X78, 0X87, 0X86,   //2012    
      0XA5, 0XB3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X87,   //2013    
      0XA5, 0XB4, 0X96, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87,   //2014    
      0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X79, 0X77, 0X87,   //2015    
      0X95, 0XB4, 0XA5, 0XB4, 0XA5, 0XA6, 0X87, 0X88, 0X87, 0X78, 0X87, 0X86,   //2016    
      0XA5, 0XC3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X87,   //2017    
      0XA5, 0XB4, 0XA6, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87,   //2018    
      0XA5, 0XB4, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X79, 0X77, 0X87,   //2019    
      0X95, 0XB4, 0XA5, 0XB4, 0XA5, 0XA6, 0X97, 0X87, 0X87, 0X78, 0X87, 0X86,   //2020    
      0XA5, 0XC3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X86,   //2021    
      0XA5, 0XB4, 0XA5, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87,   //2022    
      0XA5, 0XB4, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X79, 0X77, 0X87,   //2023    
      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    
         
};
string lunar_hol[25]={"不是节气!","小寒","大寒","立春","雨水","惊蛰","春分","清明","谷雨","立夏","小满","芒种","夏至",
"小暑","大暑","立秋","处暑","白露","秋分","寒露","霜降","立冬","小雪","大雪"," 冬至"};
void Date::GetLunarHolDay()
{
	WORD iYear=this->year,iMonth=this->month,iDay=this->day;
	const  WORD START_YEAR =1901;   
	BYTE &flag = gLunarHolDay[(iYear - START_YEAR)*12+iMonth -1];   
	WORD day;   
	if(iDay <15)   
		day= 15 - ((flag>>4)&0x0f);    
	else    
		day = ((flag)&0x0f)+15;    
	if(iDay == day) 
		LunarHolDay=lunar_hol[(iMonth-1) *2 + (iDay>15? 1: 0) +1]  ;
	else    
		LunarHolDay=lunar_hol[0];
}

bool Date::operator <(Date &b)
{
	if(this->year <b.get_y ()) return true;
	if(this->year ==b.get_y()&&this->month<b.get_m()) return true; 
	if(this->year ==b.get_y()&&this->month==b.get_m()&&this->day <b.get_d()) return true; 
	return false;
}
string Date::toString() //
{
	string str;
	stringstream strStream;
	strStream<<year<<"-"<<month<<"-"<<day;
	str+=strStream.str();
	return str;
}
vector<Date> Date::get_holday(string str)
{
	vector<Date> hol;
	string Holi[7]={ "元旦", "春节", "清明节", "劳动节", "端午节", "中秋节", "国庆节"};
	int k=-1;
	for(int i=0;i<7;i++) if(Holi[i]==str) {
		k=i;break;
	}
	switch(k)
	{
	case 0:
		for(int j=1;j<=3;j++){
			Date a(2013,1,j);
			hol.push_back(a);
		}
		break;
	case 1:
		for(int j=1;j<=8;j++){
			Date a(2013,2,j);
			hol.push_back(a);
		}
		break;
	case 2:
		for(int j=3;j<6;j++){
			Date a(2013,4,j);
			hol.push_back(a);
		}
		break;
	case 3:
		for(int j=1;j<4;j++){
			Date a(2013,5,j);
			hol.push_back(a);
		}
		break;
	case 4:
		for(int j=4;j<7;j++){
			Date a(2013,6,j);
			hol.push_back(a);
		}
		break;
	case 5:
		for(int j=10;j<13;j++){
			Date a(2013,9,j);
			hol.push_back(a);
		}
		break;
	case 6:
		for(int j=1;j<8;j++){
			Date a(2013,10,j);
			hol.push_back(a);
		}
	}
	return hol;
}

主函数测试:

#include<iostream>
#include<stdlib.h>
#include<algorithm>
#include"Date.h"
using namespace std;
char week[][20]={"星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"};
int main()
{
	cout<<"测试星期:  ";
	Date a(1998,1,15);
	printf("%d年%d月%d日是%s\n",a.get_y(),a.get_m(),a.get_d(),week[a.get_weeks()]);
	cout<<endl;
	
	cout<<"测试日期间隔:  ";
	Date b(2013,11,17);
	printf("两日期的间隔:%d\n",a.dis_days(b));
	cout<<endl;
	
	cout<<"测试取得今天函数:  ";
	Date c=Date::get_today();
	printf("今天是:");c.display ();
	cout<<endl<<endl;
	
	cout<<"测试日期加上、减去数字:";cout<<endl;
	cout<<"原本日期是: "; c.display ();
	cout<<" 加上20天之后的日期是: ";
	Date new_c=c+20;
	new_c.display();cout<<endl;
	cout<<"减去20天之后的日期是: ";
	Date new_c2=c-20;
	new_c2.display ();
	cout<<endl<<endl;
	
	cout<<"测试阳历、农历、节气:  ";cout<<endl;
	Date d(2027,6,21); // 测试阳历、农历、节气
	d.solar_lunar();
	printf("阳历是:%d-%d-%d 对应农历:%d %d %d\n",d.get_y(),d.get_m (),d.get_d(),
		d.get_lunar_year(),d.get_lunar_month(),d.get_lunar_day());
	d.GetLunarHolDay();
	cout<<"该天的节气为:"<<d.get_str()<<endl<<endl;
	

	cout<<"测试toString()功能: ";
	cout<<d.toString()<<endl<<endl;


	cout<<"测试输出法定节日功能:"<<endl;
	vector<Date> t=Date::get_holday("国庆节");//测试法定节日
	cout<<"国庆节的天数为: "<<t.size()<<" 分别为:"; 
	for(vector<Date>::iterator it=t.begin();it<t.end();it++){
		it->display();cout<<" ";
	}
	cout<<endl<<endl;

	cout<<"测试sort()排序功能:"<<endl;
	Date a_sort[5];
	Date b1(2011,3,2),b2(2013,2,4),b3(2000,3,1),b4(1923,2,5),b5(2012,3,5);
	a_sort[0]=b1;a_sort[1]=b2;a_sort[2]=b3;a_sort[3]=b4;a_sort[4]=b5;
	cout<<"排序前的日期:";
	for(int i=0;i<5;i++){
		a_sort[i].display();cout<<" ";
	}
	cout<<endl;
	sort(a_sort,a_sort+5);
	cout<<"排序后的日期:";
	for(int i=0;i<5;i++){
		a_sort[i].display();cout<<" ";
	}
	cout<<endl<<endl;
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值