edwardcmh

人氣不過肥皂泡

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
typedef struct
{
	uint16 year;                 //年
	uint8  month;                //月
	uint8  day;                  //日
	uint8  hour;                 //时,24小时制
	uint8  minute;               //分
	uint8  second;               //秒
}mr_datetime;

static int16 SW2(uint8 month)
{
	uint8 days;
	switch (month)
	{
	case 1:
	case 3:
	case 5:
	case 7:
	case 8:
	case 10:
	case 12:days = 31;break;
	case 4:
	case 6:
	case 9:
	case 11:days=30;break;
	case 2:days=28;break;
	default:mrc_printf("Error!");break;
	}
	return days;
}

/**
*    x,时间在后, 即验证时获得的时间
*    y, 时间在前,即付费时记录的时间
*    \return, 返回负数,出错,返回大于0的数表示间隔天数
*/
static int16 CalculateDays2(mr_datetime x, mr_datetime y)
{
	int i;
	int16 days = x.day;
	days -= y.day;
	
	if ((x.year == y.year) && (x.month == y.month) && (x.day == y.day))
		return 0;
	
	if (x.year > y.year)
	{
		if ((x.year % 400 == 0 || (x.year % 100 != 0 && x.year % 4 == 0)) && x.month > 2)
			days++; //    闰年2月加1
		
		if (x.year - y.year >= 1)
		{
			for (i = y.year; i < x.year; i++)
			{
				if (i % 400 == 0 || (i % 100 != 0 && i % 4 == 0))
					days += 366;
				else
					days += 365;
			}
		}
		
		if (x.month >= y.month)
		{
			for (i = y.month; i < x.month; i++)
				days += SW2(i);
		}
		else
		{
			for (i = x.month; i < y.month; i++)
				days -= SW2(i);
		}
	}
	else if (x.year == y.year)
	{
		if ((x.year % 400 == 0 ||(x.year % 100 != 0 && x.year % 4 == 0)) && x.month > 2)
			days++; // 闰年2月加1
		
		if (x.month >= y.month)
		{
			for (i = y.month; i < x.month; i++)
				days+=SW2(i);
		}
		else
		{
			mrc_printf("Error!");// 时间小于付费时,逻辑错误
			return -1;
		}
	}
	else
	{
		mrc_printf("Error!");// 时间小于付费时,逻辑错误
		return -1;
	}
	
	return days;
}
posted on 2012-05-10 15:45  edwardcmh  阅读(376)  评论(0编辑  收藏  举报