⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 datetime.c

📁 基于ARM平台的控制系统,自己带有MINIGUI,可以直接在VC下运行界面演示程序
💻 C
字号:
#include "DateTime.h"



const unsigned char MonthTab[] = {
  31,// 1 月
  29,// 2 月
  31,// 3 月
  30,// 4 月
  31,// 5 月
  30,// 6 月
  31,// 7 月
  31,// 8 月
  30,// 9 月
  31,// 10 月
  30,// 11 月
  31 // 12 月
};
//判断闰年
#define IS_LEAP_YEAR(nYear)  ((nYear % 400 == 0) || ((nYear % 100>0)&&(nYear%4==0))) 
//////////////////////////////////////////////
// 计算指定年份,月份的天数
/*=============================================================================
功能描述:	返回指定年份的某个月的天数
参    数:	int nYear		指定的年份
			int nMonth		指定的月份
返 回 值:	
其它说明:	
作    者:	DG & LTQ
日    期:	8/26/2005 2:29:03 PM
|***********修改记录**************|
	  日    期:
	  修 改 人:
	  修改原因:
	  修改内容:
=============================================================================*/
unsigned int  MonthDay(int nYear, int nMonth)
{
	unsigned int nDay;
  	
  	//提取第m月份的(闰年)天数
  	nDay = MonthTab[nMonth - 1];
  	if ((nMonth == 2) && !(IS_LEAP_YEAR( nYear ) ))
  	{
  		//非闰年的2月份
    	 nDay--;
  	}
  	return nDay;
}



// It is 2000,1,1 when the Day is 0
/*=============================================================================
功能描述:	计算从开始日期开始,指定偏移量的日期
参    数:	int nDay		用于输入日期偏移量
			DATE * pDate	返回计算结果
返 回 值:	
其它说明:	
作    者:	LTQ & DG
日    期:	8/26/2005 2:30:33 PM
|***********修改记录**************|
	  日    期:
	  修 改 人:
	  修改原因:
	  修改内容:
=============================================================================*/
void GetDateFromDay(int nDay ,NANA_DATE * pDate)
{
	int nLeftDay;
	int nYear;
	int nMonth;
	int nDayCount;
	
	nLeftDay = nDay + 1;
	nMonth = START_MONTH;
	for(nYear = START_YEAR;;nYear++)
	{
		for(;nMonth<=12;nMonth++)
		{
			nDayCount = MonthDay(nYear,nMonth);
			if(nLeftDay>nDayCount)
			{
				nLeftDay -= nDayCount;
			}else{
				pDate->uYear = nYear;
				pDate->uMonth = nMonth;
				pDate->uDay = nLeftDay;
				return ;
			}
		}
		nMonth = 1;
	}
}

/*=============================================================================
功能描述:	计算指定日期到当年元旦的日期偏移量
参    数:	DATE *pDate		指定日期
返 回 值:					到当年元旦的日期偏移量
其它说明:	
作    者:	DG & LTQ
日    期:	8/26/2005 2:31:51 PM
|***********修改记录**************|
	  日    期:
	  修 改 人:
	  修改原因:
	  修改内容:
=============================================================================*/
int GetDaysFromNewYearsDay(NANA_DATE *pDate)
{
	int nYear;
	int nMonth;
	int nDay;
	nYear = pDate->uYear;
	nDay = 0;
	for(nMonth = 1; nMonth < pDate->uMonth; nMonth++)
	{
		nDay += MonthDay(nYear,nMonth);
	}
	nDay += pDate->uDay-1;
	return nDay;
}

/*=============================================================================
功能描述:	计算两天之间的距离
参    数:	DATE *pParamStartDate	比较日期1
			DATE *pParamEndDate		比较日期2
返 回 值:				比较日期2 - 比较日期1
其它说明:	
作    者:	DG & LTQ
日    期:	8/26/2005 2:32:45 PM
|***********修改记录**************|
	  日    期:
	  修 改 人:
	  修改原因:
	  修改内容:
=============================================================================*/
int GetDateDistance(NANA_DATE *pParamStartDate,NANA_DATE *pParamEndDate)
{
	int nYear;
	int nMonth;
	int nDay;

	int bNegtive;
	NANA_DATE *pStartDate;
	NANA_DATE *pEndDate;

	nDay = 0;
	switch(DateCompare(pParamStartDate,pParamEndDate))
	{
	case 0:
		return 0;
		break;
	case 1:
		pStartDate = pParamEndDate;
		pEndDate = pParamStartDate;
		bNegtive = 1;
		break;
	case -1:
		pStartDate = pParamStartDate;
		pEndDate = pParamEndDate;
		bNegtive = 0;
		break;
	}

	if(pStartDate->uYear != pEndDate->uYear)
	{
		//计算第一年剩余的天数
		nYear = pStartDate->uYear;
		nMonth = pStartDate->uMonth;
		nDay =  MonthDay(nYear,nMonth) - pStartDate->uDay + 1;
		for(nMonth = pStartDate->uMonth + 1 ; nMonth <= 12 ; nMonth++)
		{
			nDay += MonthDay(nYear,nMonth);
		}
		//计算中间几年的天数
		nYear++;
		for(;nYear<pEndDate->uYear;nYear++)
		{
			nDay += (IS_LEAP_YEAR(nYear)?366:365);
		}
		//计算最后一年的天数
		nDay += GetDaysFromNewYearsDay(pEndDate);
	}
	else
	{
		nDay =  GetDaysFromNewYearsDay(pEndDate) - 
				GetDaysFromNewYearsDay(pStartDate);
	}

	if(bNegtive)
	{
	 	nDay = -nDay;
	}
	
	return nDay;
	
}


/*=============================================================================
功能描述:	比较两个日期的先后
参    数:	DATE * pDate1	日期1
			DATE * pDate2	日期2
返 回 值:	1  说明 *pDate1 比 *pDate2 晚
			0  说明 两天相同
			-1 说明 *pDate1 比 *pDate2 早
其它说明:	
作    者:	DG
日    期:	8/26/2005 2:34:03 PM
|***********修改记录**************|
	  日    期:
	  修 改 人:
	  修改原因:
	  修改内容:
=============================================================================*/
int DateCompare(NANA_DATE * pDate1, NANA_DATE * pDate2)
{
	if (pDate1->uYear > pDate2->uYear)
	{
		return 1;
	}else if (pDate1->uYear == pDate2->uYear ) 
	{
		if (pDate1->uMonth > pDate2->uMonth )
		{
			return 1;
		}else if (pDate1->uMonth == pDate2->uMonth ) 
		{
			if (pDate1->uDay > pDate2->uDay ) 
			{
				return 1;
			}else if(pDate1->uDay == pDate2->uDay )
			{
				return 0;
			}else
			{
				return -1;
			}	
		}else
		{
			return -1;
		}	
	}else
	{	
		return -1;
	}	
}



const unsigned char WeekTab[] = {
  (3 << 5) + 31,
  (6 << 5) + 29,
  (0 << 5) + 31,
  (3 << 5) + 30,
  (5 << 5) + 31,
  (1 << 5) + 30,
  (3 << 5) + 31,
  (6 << 5) + 31,
  (1 << 5) + 30,
  (4 << 5) + 31,
  (0 << 5) + 30,
  (2 << 5) + 31 
};




//////////////////////////////////////////////
// 计算0000到9999年星期几
// 返回 星期<<5 + 每月天数
unsigned char WeekDay(int cy, int m,int d)
{
	unsigned char c;
	unsigned char y;
	unsigned char week, day;
	c = cy/100;
	y = cy % 100;

	c &= 0x03;
  	c = c | (c << 2);
  	
  	//提取第m月份的(闰年)天数和该月第一天的星期
  	day = WeekTab[m - 1];
  	week = day >> 5;
  	day &= 0x1f;
  	
  	if (
  		(m < 3) && 
  		/*
  		(!((c == 0) | (y & ((y & 0x03) == 0))))
  		*/
  		!( (cy % 400 == 0) || ((cy % 100>0)&&(cy%4==0)) )
  		
  		)
  	{
  		//非闰年的1,2月份
    	if (m == 2) day--;
    	week++;
  	}
  	
  	//
  	// (y>>2)	从整百年到第y年共经历的闰年数
  	// y		从整百年到到第y年共经历的年数
  	// week		0000年的第m月第0天的星期几
  	//
  	y = y + (y >> 2);
  	week = (week + c + y + d + 2) % 7;
  	
  	return (week << 5) | day;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -