⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 date.cpp

📁 这是以前为了实现0001-9999年所有日期而设计的C++类
💻 CPP
字号:

class TDate
{
	int m_day;//公元0001年1月1日=0...(没有0000年)
public:
	TDate();
	TDate(PCSTR ch);
	TDate(int year,int mm=1,int dd=1);
	void SetDate(int year,int mm=1,int dd=1);
	int GetYear();
	int GetMonth();
	int GetDay();
	int GetAge();
	TDate& GetToday();
	TDate& operator =(PCSTR ch);
	PCSTR Format(PCSTR format);
	bool   operator ==(TDate& d){return *(long*)this==*(long*)(&d);};
	bool   operator > (TDate& d){return *(long*)this> *(long*)(&d);};;
	bool   operator < (TDate& d){return *(long*)this< *(long*)(&d);};
	bool   operator >=(TDate& d){return *(long*)this>=*(long*)(&d);};
	bool   operator <=(TDate& d){return *(long*)this<=*(long*)(&d);};
	int    operator - (TDate& d){return *(long*)this-*(long*)(&d);};
	TDate& operator -=(int n){m_day-=n;return *this;};
	TDate& operator +=(int n){m_day+=n;return *this;};
	TDate  operator - (int n);
	TDate  operator + (int n);
};



static int nEachDay[][13]=
{
	{0,31,28,31,     30,31,30,     31,31,30,    31,30,31},
	{0,31,29,31,     30,31,30,     31,31,30,    31,30,31}
};
static int nTotleDay[][13]=
{
	{0,31,59,90,     120,151,181,     212,243,273,    304,334,365},
	{0,31,60,91,     121,152,182,     213,245,274,    305,335,366}
};
const int d400=365*400+97;//146097 天
const int d100=365*100+24;// 36524 天
const int d004=365*4+1;   //  1441 天

bool is366(int year)
{
	if((year&3))return false;
	if(year%400)return true;
	if(year%100)return false;
	return true;
}
TDate::TDate()
{
	m_day=0;
}
TDate::TDate(PCSTR ch)
{
	*this=ch;
}
TDate::TDate(int year,int mm,int dd)
{
	SetDate(year,mm,dd);
}
void TDate::SetDate(int year,int mm,int dd)
{
	bool b366=is366(year);
	m_day=year*365+(year-1)/4-(year-1)/100+(year-1)/400;
	if(mm<1)mm=1;  if(mm>12)mm=12;
	int maxdd=nEachDay[b366?1:0][mm];
	if(dd<1)dd=1;  if(dd>maxdd)dd=maxdd;
	m_day+=nTotleDay[b366?1:0][mm-1]+dd;
}
int TDate::GetYear()
{
	return m_day/d400*400+
		(m_day%d400)/d100*100+
		((m_day%d400)%d100)/d004*4+
		min(3,(((m_day%d400)%d100)%d004)/365);
}
int TDate::GetMonth()
{
	int day=m_day%d400%d100%d004%365;//一年的第几天
	int n=day>=365*3?0:1;//闰年

	for(int i=1;i<=12;i++)
	{
		if(day<nTotleDay[n][i])return i;
	}
	return 0;
}
int TDate::GetDay()
{
	int day=m_day%d400%d100%d004%365;//一年的第几天
	int n=day>=365*3?0:1;//闰年
	for(int i=1;i<=12;i++)
	{
		if(day<nTotleDay[n][i])return day-nTotleDay[n][i-1]+1;
	}
	return 0;
}
int TDate::GetAge()
{
	return CTime::GetCurrentTime().GetYear()-GetYear();
}
TDate& TDate::GetToday()
{
	int y=CTime::GetCurrentTime().GetYear();
	int m=CTime::GetCurrentTime().GetMonth();
	int d=CTime::GetCurrentTime().GetDay();
	SetDate(y,m,d);
	return *this;
}
TDate  TDate::operator - (int n)
{
	TDate d;
	d.m_day=m_day-n;
	return d;
}
TDate  TDate::operator + (int n)
{
	TDate d;
	d.m_day=m_day+n;
	return d;
}
TDate& TDate::operator =(PCSTR ch)
{
	if(stricmp(ch,"now")==0)
	{
		GetToday();
		return *this;
	}
	s_date d;
	if(!GetDate(d,ch))
	{
		m_day=0;
		return *this;
	}
	SetDate(d.y,d.m,d.d);
	return *this;

}
PCSTR TDate::Format(PCSTR format)
{
	if(!m_day)return "";
	static char s[128];
	static char smonth[12][16]={"","",""};
	if(smonth[0][0]==0)//初始化
	{
		for(int i=0;i<12;i++)
		{
			CTime t(1999,i+1,1,12,0,0);
			strcpy(smonth[i],t.Format("%B"));
		}
	}
	if(format==0)return 0;
	int fi,si;
	int y=GetYear();
	int m=GetMonth();
	int d=GetDay();

	for(fi=si=0;format[fi];fi++)
	{
		if(si>100)break;
		if(format[fi]!='%' || format[fi+1]==0)
		{
			s[si++]=format[fi];
			continue;
		}
		switch(format[++fi])
		{
		case 'Y':
			s[si++]=char('0'+y/1000);
			s[si++]=char('0'+y%1000/100);
			s[si++]=char('0'+y%100/10);
			s[si++]=char('0'+y%10/1);
			break;
		case 'y':
			s[si++]=char('0'+y%100/10);
			s[si++]=char('0'+y%10/1);
			break;
		case 'M':
			s[si++]=char('0'+m%100/10);
			s[si++]=char('0'+m%10/1);
			break;
		case 'm':
			if(m>9)s[si++]=char('0'+m%100/10);
			s[si++]=char('0'+m%10/1);
			break;
		case 'D':
			s[si++]=char('0'+d%100/10);
			s[si++]=char('0'+d%10/1);
			break;
		case 'd':
			if(d>9)s[si++]=char('0'+d%100/10);
			s[si++]=char('0'+d%10/1);
			break;
		case 'B'://月份英文全称
			strcpy(s+si,smonth[m-1]);
			si+=strlen(smonth[m-1]);
			break;
		case 'b'://月份英文前三个字符
			s[si++]=smonth[m-1][0];
			s[si++]=smonth[m-1][1];
			s[si++]=smonth[m-1][2];
			break;
		default:
			s[si++]=format[fi-1];
			s[si++]=format[fi];
			break;
		}
	}
	s[si]=0;
	return s;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -