/*************************************************************************************** 建立头文件"date.h" ****************************************************************************************/ #ifndef __DATE_H #define __DATE_H #include "stm8_macro.h" #include "ds1302.h" long DaysApart(u16 year1, u8 month1, u8 day1, u16 year2, u8 month2, u8 day2); u8 GetDayofWeek(u16 year, u8 month, u8 day); void DateStep(u16* year, u8* month, u8* day); void DateBack(u16* year, u8* month, u8* day); #endif /* __TIME_DATE_H */ /*************************************************************************************** 建立源文件"date.c" ****************************************************************************************/ #include "date.h" /* @Function : 是否是闰年 @Input : year 年份 @Output : 1 闰年 0 平年 **/ static u8 IsLeapYear(u16 year) { if( (year%100 == 0 && year%400 == 0) || (year%100 != 0 && year%4 == 0) ) { return 1; } else return 0; } /* @Function : 计算某个月份的天数 @Input : year 年份 month 月份 @Output : 天数 **/ static u8 GetDaysInMonth(u16 year, u8 month) { u8 days = 0; switch(month) { case 2: if(IsLeapYear(year)) days = 29; else days = 28; break; case 4: case 6: case 9: case 11: days = 30; break; default: days = 31; break; } return days; } /* @Function: 计算两个日期相隔天数,年份 @Input : year1,month1,day1 日期1 year2, month2, day2 日期2 @Output : 0xffff: 出错 other : 两个日期相隔的天数,日期2 - 日期1 < 0 : 表示日期1 > 日期2 **/ long DaysApart( u16 year1, u8 month1, u8 day1, u16 year2, u8 month2, u8 day2) { u16 i; long res_days = 0; //日期格式错误,error if( month1 >12 || month2 >12 || day1 >31 || day2 >31 || !year1 || !year2 || !month1 || !month2 || !day1 || !day2 ) { return 0xffff; } //日期1比日期2后 if( ( year1 > year2) || ((year1 == year2) && (month1 > month2)) || ((year1 == year2) && (month1 == month2) && (day1 > day2))) { res_days = -1 * DaysApart(year2, month2, day2, year1, month1, day1); return res_days; } //天数计算 if(year1 != year2)//不同年份 { //第一年的天数 res_days = GetDaysInMonth(year1, month1) - day1; for(i=month1+1; i<=12; i++) { res_days += GetDaysInMonth(year1, (u8)i); } //最后一年的天数 for(i=1; i= 0) { dayofweek = (u8)((days + 1)%7); if(dayofweek == 0) dayofweek = 7; } else { dayofweek = (u8)((-1*days)%7); dayofweek = (u8)((dayofweek == 0)?(1):((8-dayofweek))); } return dayofweek; } /* @Function: 日期步进,日期前进一天 @Input : year month day @Output : None **/ void DateStep(u16* year, u8* month, u8* day) { u8 daysofMonth; daysofMonth = GetDaysInMonth(*year, *month); if(++(*day) > daysofMonth) { *day = 1; if(++(*month) > 12) { *month = 1; ++(*year); } } } /* @Function: 日期步进,日期倒退一天 @Input : year month day @Output : None **/ void DateBack(u16* year, u8* month, u8* day) { if(--(*day) == 0) { if(--(*month) == 0) { *month = 12; --(*year); } *day = GetDaysInMonth(*year, *month); } }