#include <iostream>
using namespace std;
#include "MyDate.h"
#include <iomanip>
bool MYDATE::dowFlag = false;
void MYDATE::Input()
{
int year, month, day;
char c1, c2;
while(!(cin >> year >> c1 >> month >> c2 >> day) || ! IsValid(year, month, day) || c1 != '-' || c2 != '-')
{
cout << "不正确的日期! 请重新输入: ";
if(! cin.good()) cin.clear();
while(cin.get() != '\n') ;
}
this->year = year;
this->month = month;
this->day = day;
}
void MYDATE::Output()
{
char *adow[] = {"日", "一", "二", "三", "四", "五", "六"};
int w = Dow();
cout << setfill('0') << setw(2) << year
<< '-' << setw(2) << month
<< '-' << setw(2) << day << setfill(' ');
if(dowFlag)
{
cout << "(星期" << adow[w] << ")";
}
}
void MYDATE::Set(int year, int month, int day)
{
if(IsValid(year, month, day))
{
this->year = year;
this->month = month;
this->day = day;
}
else
{
cout << "不正确的时间,设置失败!\n";
}
}
void MYDATE::Get(int &year, int &month, int &day)
{
year = this->year;
month = this->month;
day = this->day;
}
int MYDATE::Year()
{
return year;
}
void MYDATE::Year(int year)
{
if(year > 0)
{
this->year = year;
int n = Dom(year, month);
if(day > n) day = n;
}
}
int MYDATE::Month()
{
return month;
}
void MYDATE::Month(int month)
{
if(month > 0 && month <= 12)
{
this->month = month;
int n = Dom(year, month);
if(day > n) day = n;
}
}
int MYDATE::Day()
{
return day;
}
void MYDATE::Day(int day)
{
int n = Dom(year, month);
if(day <= 0) day = 1;
else if(day > n) day = n;
this->day = day;
}
MYDATE MYDATE::Add(int x)
{
int y = 1,i = 1,m = 1;
MYDATE c;
double s = this->Tod() + x;
if(s >= 0)
{
y = 1;
while(s >= 365 + IsLeap(y))
{
s = s - (365 + IsLeap(y++));
i ++;
}
c.year = i;
while(s >= Dom(c.year,m))
{
s = s - Dom(c.year,m);
m ++;
}
c.month = m;
if(s == 0) c.day = 1;
else c.day = s;
}
else cout << "Error!\n";
return c;
}
MYDATE MYDATE::Sub(int x)
{
MYDATE c;
c.Set(year, month, day);
c = c.Add(-x);
return c;
}
bool MYDATE::IsValid(int year, int month, int day)
{
return year > 0 && month > 0 && month <= 12 && day > 0 && day <= Dom(year, month);
}
int MYDATE::Dom(int year, int month)
{
int n = 0;
const static char adom[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if(month > 0 && month <= 12)
{
n = adom[month - 1];
if(month == 2 && IsLeap(year)) n ++;
}
return n;
}
int MYDATE::Doy()
{
const static short adoy[] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
int n = adoy[month - 1] + day;
if(month > 2 && IsLeap(year)) n ++;
return n;
}
bool MYDATE::IsLeap(int year)
{
return year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
}
int MYDATE::Nol(int year)
{
return year / 4 - year / 100 + year / 400;
}
int MYDATE::Tod()
{
int t = year - 1;
return t * 365 + Nol(t) + Doy();
}
int MYDATE::Dow()
{
return Tod() % 7;
}
int MYDATE::Sub(MYDATE &x)
{
return this->Tod() - x.Tod();
}