📄 datetime.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 + -