#include "stdafx.h"
#include "windows.h"
typedef struct tagmyDATE
{
int year ;
int month ;
int day ;
}myDATE;
//用于表示两个时间之间的差值,负值表示慢,正值表示快
typedef struct tagTIMEDISTANCE
{
LONG days ; //相差的天数
LONG seconds ; //不足一天的部分的差值
}TIMEDISTANCE;
int month_days[] = { 0, 31, 28, 31, 30, 31, 30, //0表示月份未指定,1-6月
31, 31, 30, 31, 30, 31 //7-12月
};
//传回阳历 y年某m月的天数
int solarDays(UINT y,UINT m)
{
if(m<1)
return 0;
if(m==2)//2月
{
return(((y%4 == 0) && (y%100 != 0) || (y%400 == 0))? 29: 28);
}
else
{
return(month_days[m]);
}
}
//date与公元 0年相差的天数
LONG lDaysFront(myDATE date)
{
int i ;
LONG days;
//y年以前的总天数
days=365*date.year+(date.year-1)/4-(date.year-1)/100+(date.year-1)/400 ;
//当年已过的几个月的天数
for( i=1;i<date.month;i++)
{
days+=month_days[i];
}
days+=date.day; //当月的天数
//为闰年时判断当前日期是否为二月之后
if((date.year%4==0&&date.year%100!=0)||date.year%400==0)
{
if(date.month>2)
{
days++;
}
}
return days;
}
//传回从公元 0年算起经过 days 天后的阳历日期
myDATE GetDateFront ( LONG days )
{
int i, year ;
BOOL isLeapYear = FALSE ;
LONG temp = 0 ;
myDATE date ;
//年
for ( i = 0; days > 0; i++ )
{
days -= ( (i%4==0 && i%100!=0) || i%400==0 ) ? 366 : 365 ;
}
i-- ;
date.year = i ;
isLeapYear = (i%4==0 && i%100!=0)||i%400==0 ;
days += isLeapYear ? 366 : 365 ; //当年已过的天数
//月
for ( i = 1; days>0 && i<=12; i++ )
{
days -= solarDays (date.year, i) ;
}
//if ( i > 12 )
//{
//
//}
i-- ;
date.month = i ;
date.day = days + solarDays (date.year, i) ;
return date ;
}
//两个系统时间相减,返回两时间的差值
TIMEDISTANCE SubTime ( SYSTEMTIME minu, SYSTEMTIME sub )
{
LONG firseconds, secseconds ;
TIMEDISTANCE timedistance ;
myDATE firdate, secdate ;
firdate.year = minu.wYear ;
firdate.month = minu.wMonth ;
firdate.day = minu.wDay ;
secdate.year = sub.wYear ;
secdate.month = sub.wMonth ;
secdate.day = sub.wDay ;
timedistance.days = lDaysFront (firdate) - lDaysFront (secdate) ;
firseconds = minu.wHour * 60 * 60L + minu.wMinute * 60L + minu.wSecond ;
secseconds = sub.wHour * 60 * 60L + sub.wMinute * 60L + sub.wSecond ;
timedistance.seconds = firseconds - secseconds ;
return timedistance ;
}
//时间与相对该时间的偏移值相加,即差值,返回与 st相对偏差为 td的时间
SYSTEMTIME AddTime ( SYSTEMTIME st, TIMEDISTANCE td )
{
myDATE date ;
LONG ldays, lseconds ;
date.year = st.wYear ;
date.month = st.wMonth ;
date.day = st.wDay ;
ldays = lDaysFront (date) + td.days ;
lseconds = st.wHour * 60 * 60L + st.wMinute * 60 + st.wSecond + td.seconds ;
if ( lseconds < 0 )
{
lseconds += 24 * 60 * 60L ;
ldays-- ;
}else if ( lseconds >= 24 * 60 * 60L )
{
lseconds -= 24 * 60 * 60L ;
ldays++ ;
}
date = GetDateFront (ldays) ;
st.wYear = date.year ;
st.wMonth = date.month ;
st.wDay = date.day ;
st.wHour = lseconds / (60 * 60) ;
lseconds %= ( 60 * 60 ) ;
st.wMinute = lseconds / 60 ;
st.wSecond = lseconds % 60 ;
st.wDayOfWeek = 1 ;
st.wMilliseconds = 0 ;
return st ;
}
//test
void main ()
{
myDATE date = {2,1,1};
LONG days ;
days = lDaysFront (date) ;
getchar() ;
}