📄 xdatetime.cpp
字号:
XInt XLongDate::CalcLongDate(const XDate & aDate)
{
return CalcLongDate( aDate.GetYear(),aDate.GetMonth(),aDate.GetDay() );
}
XInt XLongDate::CalcLongDate(const TDateTime & aDateTime)
{
XWord aYear,aMonth,aDay;
aDateTime.DecodeDate( &aYear, &aMonth, &aDay );
return CalcLongDate( aYear,aMonth,aDay );
}
XInt XLongDate::CalcLongDate(const XDateTime & aDateTime)
{
return aDateTime.GetLongDate();
}
XInt XLongDate::CalcLongDate(int aYear,int aMonth,int aDay)
{
int aDays = GetDays(aYear,aMonth,aDay);
if( aDays == -1 ) throw XEDateTimeError();
return aDays;
}
void XLongDate::Decode(int &aYear,int &aMonth,int &aDay) const
{
int N400 = m_LongDate / 146097;
int D = m_LongDate % 146097;
int N100 = D / 36524;
D = D % 36524;
int N4 = D / 1461;
D = D % 1461;
int N = D / 365;
D = D % 365;
int NYear = N400 * 400 + N100 * 100 + N4 * 4 + N;
int TDays = 0;
if( D > 0)
{
NYear ++;
aYear = NYear;
for(int i=1;i<13;i++)
{
TDays += GetMonthDays(NYear,i);
if( D <= TDays )
{
aMonth = i;
aDay = D - TDays + GetMonthDays(NYear,i);
break;
}
}
}
else
{
aYear = NYear;
aMonth = 12;
aDay = 31;
}
}
void XLongDate::Decode(XDate & aDate) const
{
int aYear,aMonth,aDay;
Decode(aYear,aMonth,aDay);
aDate.SetDate( aYear, aMonth, aDay);
}
XDate XLongDate::Decode() const
{
XDate aDate;
Decode(aDate);
return aDate;
}
//operator-
XLongDate XLongDate::operator-(XInt aDays) const
{
return XLongDate( m_LongDate - aDays );
}
//operator+
XLongDate XLongDate::operator+(XInt aDays) const
{
return XLongDate( m_LongDate + aDays );
}
//operator-=
XLongDate & XLongDate::operator-=(XInt aDays)
{
m_LongDate = RoundDate( m_LongDate - aDays); return *this;
}
//operator+=
XLongDate & XLongDate::operator+=(XInt aDays)
{
m_LongDate = RoundDate( m_LongDate + aDays); return *this;
}
bool XLongDate::operator==(const XLongDate & aLongDate) const
{
return m_LongDate == aLongDate.m_LongDate;
}
bool XLongDate::operator==(XInt aLongDate ) const
{
return m_LongDate == RoundDate( aLongDate );
}
bool XLongDate::operator==(const XDateTime & aDateTime) const
{
return m_LongDate == aDateTime.GetLongDate();
}
bool XLongDate::operator==(const XDate & aDate) const
{
return m_LongDate == aDate.GetDays();
}
bool XLongDate::operator==(const TDateTime & aDateTime) const
{
return m_LongDate == CalcLongDate(aDateTime);
}
bool XLongDate::operator!=(const XLongDate & aLongDate) const
{
return m_LongDate != aLongDate.m_LongDate;
}
bool XLongDate::operator!=(XInt aLongDate ) const
{
return m_LongDate != RoundDate( aLongDate );
}
bool XLongDate::operator!=(const XDateTime & aDateTime) const
{
return m_LongDate != aDateTime.GetLongDate();
}
bool XLongDate::operator!=(const XDate & aDate) const
{
return m_LongDate != aDate.GetDays();
}
bool XLongDate::operator!=(const TDateTime & aDateTime) const
{
return m_LongDate != CalcLongDate(aDateTime);
}
bool XLongDate::operator>=(const XLongDate & aLongDate) const
{
return m_LongDate >= aLongDate.m_LongDate;
}
bool XLongDate::operator>=(XInt aLongDate ) const
{
return m_LongDate >= RoundDate( aLongDate );
}
bool XLongDate::operator>=(const XDateTime & aDateTime) const
{
return m_LongDate >= aDateTime.GetLongDate();
}
bool XLongDate::operator>=(const XDate & aDate) const
{
return m_LongDate >= aDate.GetDays();
}
bool XLongDate::operator>=(const TDateTime & aDateTime) const
{
return m_LongDate >= CalcLongDate(aDateTime);
}
bool XLongDate::operator<=(const XLongDate & aLongDate) const
{
return m_LongDate <= aLongDate.m_LongDate;
}
bool XLongDate::operator<=(XInt aLongDate ) const
{
return m_LongDate <= RoundDate( aLongDate );
}
bool XLongDate::operator<=(const XDateTime & aDateTime) const
{
return m_LongDate <= aDateTime.GetLongDate();
}
bool XLongDate::operator<=(const XDate & aDate) const
{
return m_LongDate <= aDate.GetDays();
}
bool XLongDate::operator<=(const TDateTime & aDateTime) const
{
return m_LongDate <= CalcLongDate(aDateTime);
}
bool XLongDate::operator<(const XLongDate & aLongDate) const
{
return m_LongDate < aLongDate.m_LongDate;
}
bool XLongDate::operator<(XInt aLongDate ) const
{
return m_LongDate < RoundDate( aLongDate );
}
bool XLongDate::operator<(const XDateTime & aDateTime) const
{
return m_LongDate < aDateTime.GetLongDate();
}
bool XLongDate::operator<(const XDate & aDate) const
{
return m_LongDate < aDate.GetDays();
}
bool XLongDate::operator<(const TDateTime & aDateTime) const
{
return m_LongDate < CalcLongDate(aDateTime);
}
bool XLongDate::operator>(const XLongDate & aLongDate) const
{
return m_LongDate > aLongDate.m_LongDate;
}
bool XLongDate::operator>(XInt aLongDate ) const
{
return m_LongDate > RoundDate( aLongDate );
}
bool XLongDate::operator>(const XDateTime & aDateTime) const
{
return m_LongDate > aDateTime.GetLongDate();
}
bool XLongDate::operator>(const XDate & aDate) const
{
return m_LongDate > aDate.GetDays();
}
bool XLongDate::operator>(const TDateTime & aDateTime) const
{
return m_LongDate > CalcLongDate(aDateTime);
}
//求相差的天数
XInt XLongDate::operator-(const XLongDate & aLongDate) const
{
return m_LongDate - aLongDate.m_LongDate;
}
XInt XLongDate::operator-(const XDate & aDate) const
{
return m_LongDate - CalcLongDate( aDate );
}
XInt XLongDate::operator-(const XDateTime & aDateTime) const
{
return m_LongDate - CalcLongDate( aDateTime );
}
XInt XLongDate::operator-(const TDateTime & aDateTime) const
{
return m_LongDate - CalcLongDate( aDateTime );
}
//设置日期
void XLongDate::SetDate(int aYear,int aMonth,int aDay)
{
m_LongDate = CalcLongDate(aYear,aMonth,aDay);
}
void XLongDate::SetDate(const XDate & aDate)
{
m_LongDate = CalcLongDate( aDate );
}
void XLongDate::SetDate(const XLongDate & aLongDate)
{
m_LongDate = aLongDate.m_LongDate;
}
void XLongDate::SetDate(const XDateTime & aDateTime)
{
m_LongDate = CalcLongDate(aDateTime);
}
void XLongDate::SetDate(const TDateTime & aDateTime)
{
m_LongDate = CalcLongDate(aDateTime);
}
XLongDate & XLongDate::operator++()
{
m_LongDate = RoundDate( m_LongDate + 1 );
return *this;
}
XLongDate XLongDate::operator++(int)
{
XLongDate tmp(*this);
m_LongDate = RoundDate( m_LongDate + 1 );
return tmp;
}
XLongDate & XLongDate::operator--()
{
m_LongDate = RoundDate( m_LongDate - 1 );
return *this;
}
XLongDate XLongDate::operator--(int)
{
XLongDate tmp(*this);
m_LongDate = RoundDate( m_LongDate - 1 );
return tmp;
}
XLongDate::operator XDate() const
{
XDate aDate;
Decode(aDate);
return aDate;
}
XLongDate::operator TDateTime() const
{
int aYear,aMonth,aDay;
Decode(aYear, aMonth, aDay);
return TDateTime((XWord)aYear, (XWord)aMonth, (XWord)aDay);
}
XLongDate::operator XDateTime() const
{
XDateTime tmp(*this);
return tmp;
}
//------------------------------------------------------------------------------
void XDate::SetDate(int aYear,int aMonth,int aDay)
{
if( aYear<1 || aYear > 9999 ) throw XEDateTimeError(DATETIME_INVALIDATION_YEAR,aYear);
if( aMonth<1 || aMonth > 12 ) throw XEDateTimeError(DATETIME_INVALIDATION_MONTH,aMonth);
int aMonthDay = GetMonthDays( aYear, aMonth );
if( aDay <1 || aDay > aMonthDay )
{
throw XEDateTimeError(DATETIME_INVALIDATION_DAY,aDay);
}
m_Year = (XWord)aYear;
m_Month = (XByte)aMonth;
m_Day = (XByte)aDay;
}
void XDate::SetDate(const XDate & aDate)
{
m_Year = aDate.m_Year;
m_Month = aDate.m_Month;
m_Day = aDate.m_Day;
}
void XDate::SetDate(const XDateTime & aDateTime)
{
aDateTime.DecodeDate( *this );
}
void XDate::SetDate(const TDateTime & aDateTime)
{
XWord aYear,aMonth,aDay;
aDateTime.DecodeDate( &aYear, &aMonth, &aDay );
m_Year = aYear;
m_Month = (XByte)aMonth;
m_Day = (XByte)aDay;
}
void XDate::SetDate(const XLongDate & aLongDate)
{
aLongDate.Decode( *this );
}
void XDate::SetYear(int aYear)
{
if( aYear != m_Year )
{
int aDays = zdhsoft::GetDays( aYear, m_Month, m_Day );
if( aDays == -1 ) throw XEDateTimeError();
m_Year = (XWord)aYear;
}
}
void XDate::SetMonth(int aMonth)
{
if( aMonth != m_Month )
{
int aDays = zdhsoft::GetDays( m_Year, aMonth, m_Day );
if( aDays == -1 ) throw XEDateTimeError();
m_Month = (XByte)aMonth;
}
}
void XDate::SetDay(int aDay)
{
if( aDay != m_Day )
{
int aDays = zdhsoft::GetDays( m_Year, m_Month, aDay );
if( aDays == -1 ) throw XEDateTimeError();
m_Day = (XByte)aDay;
}
}
int XDate::GetWeek() const
{
return GetDays() % 7;
}
int XDate::GetDays() const
{
return zdhsoft::GetDays(m_Year,m_Month,m_Day);
}
XDate::XDate()
:m_Year(2000),m_Month(1),m_Day(1)
{
}
XDate::XDate(const XDate & aDate)
:m_Year( aDate.m_Year ),
m_Month( aDate.m_Month ),
m_Day( aDate.m_Day )
{
}
XDate::XDate(const XDateTime & aDateTime)
{
aDateTime.DecodeDate(*this);
}
XDate::XDate(const TDateTime & aDateTime)
{
XWord aYear,aMonth,aDay;
aDateTime.DecodeDate( &aYear,&aMonth,&aDay);
m_Year = aYear;
m_Month = aMonth;
m_Day = aDay;
}
XDate::XDate(const XLongDate & aLongDate)
{
int aYear,aMonth,aDay;
aLongDate.Decode( aYear,aMonth,aDay);
m_Year = (XWord)aYear;
m_Month = (XByte)aMonth;
m_Day = (XByte)aDay;
}
XDate::XDate(int aYear,int aMonth,int aDay)
{
SetDate( aYear, aMonth, aDay );
}
XDate & XDate::operator = (const XDate & aDate )
{
SetDate( aDate );
return *this;
}
XDate & XDate::operator = (const XDateTime & aDateTime )
{
SetDate( aDateTime );
return *this;
}
XDate & XDate::operator = (const TDateTime & aDateTime )
{
SetDate( aDateTime );
return *this;
}
XDate & XDate::operator = (const XLongDate & aLongDate )
{
SetDate( aLongDate );
return *this;
}
AnsiString XDate::ToString()
{
AnsiString strTmp;
strTmp.printf("%04d-%02d-%02d",GetYear(),GetMonth(),GetDay());
return strTmp;
}
//------------------------------------------------------------------------------
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -