📄 date.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 + -