时间加减法

 #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() ;
 
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值