#include "date.h"
#include <stdio.h>
#define M1 31 //一月天数
#define M2 28 //二月天数(平年)
#define M2_LEAP 29 //二月天数(闰年)
#define M3 31
#define M4 30
#define M5 31
#define M6 30
#define M7 31
#define M8 31
#define M9 30
#define M10 31
#define M11 30
#define M12 31
#define YEAR 365 //平年总天数
#define YEAR_LEAP 366 //闰年总天数
int getRestdays(myDate *date);
int getDays( myDate *date);
myDate newDate( myDate *today, int d);
int isEqual( myDate *date1, myDate *date2);
//计算平年中N月前的1~N-1月的天数
static int preDays(int m){
if(m == 1)
return 0;
else if(m == 2)
return M1; //31
else if(m == 3)
return M1+M2;//31+28=59
else if(m == 4)
return M1+M2+M3;//31+28+31=90
else if(m == 5)
return M1+M2+M3+M4;//120
else if(m == 6)
return M1+M2+M3+M4+M5;//151
else if(m == 7)
return M1+M2+M3+M4+M5+M6;//181
else if(m == 8)
return M1+M2+M3+M4+M5+M6+M7;//212
else if(m == 9)
return M1+M2+M3+M4+M5+M6+M7+M8;//243
else if(m == 10)
return M1+M2+M3+M4+M5+M6+M7+M8+M9;//273
else if(m == 11)
return M1+M2+M3+M4+M5+M6+M7+M8+M9+M10;//304
else
return M1+M2+M3+M4+M5+M6+M7+M8+M9+M10+M11;//334
}
/*
判断日期合法性
*/
int isLegal(int y, int m, int d){
if(y < 0)
return 0;
switch(m){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
if(d < 1 || d > M1) return 0;
break;
case 4:
case 6:
case 9:
case 11:
if(d < 1 || d > M4) return 0;
break;
case 2:
if((y % 400 == 0 ) || (y % 4 == 0 && y % 100 != 0)){
if(d < 1 || d > M2_LEAP) return 0;
}else{
if(d < 1 || d > M2) return 0;
}
break;
default:
return 0;
}
return 1;
}
/*
为两个日期选定基准年,年份靠前的为基准年
*/
static myDate getBaseyear(myDate *date1, myDate *date2){
if((*date1).year != (*date2).year){
if((*date1).year < (*date2).year)
return (*date1);
else
return (*date2);
}
else{
if((*date1).month != (*date2).month){
if((*date1).month < (*date2).month)
return (*date1);
else
return (*date2);
}
else{
if((*date1).day < (*date2).day)
return (*date1);
else
return (*date2);
}
}
}
/*
//计算日期d1与日期d2的间隔天数
*/
int getDateToBase(myDate *date1, myDate *date2){
int days = 0, i;
myDate d2 = getBaseyear(date1,date2);
myDate d1;
if((*date1).year == d2.year && (*date1).month == d2.month && (*date1).day == d2.day){
d1.year = (*date2).year;
d1.month = (*date2).month;
d1.day = (*date2).day;
}
else{
d1.year = (*date1).year;
d1.month = (*date1).month;
d1.day = (*date1).day;
}
//printf("test:%d %d",d1.year,d2.year);
//与basedate同年
if(d1.year == d2.year){
days = d1.day - d2.day;
}
//比basedate刚好迟一年
else if(d1.year - d2.year == 1){
days = getDays(&d1) + getRestdays(&d2);
}
//比basedate迟一年以上
else{
//先计算basedate后一年 至 year年之前的总天数
for(i = d2.year + 1; i < d1.year; i++){
if(isLeapyear(i))
days = days + YEAR_LEAP;
else
days = days + YEAR;
}
//算出两个日期的间隔天数
days = days + getRestdays(&d2) + getDays(&d1);
}
return days;
}
/*
计算日期baseDate d 天后(前)的日期
*/
myDate getNewDate( myDate *baseDate, int d){
myDate tmpDate;
int gapDays;
if(d >= 0)
return newDate(baseDate, d);
else{
d = -d;
tmpDate.year = (*baseDate).year - d/YEAR_LEAP - 1;
tmpDate.month = (*baseDate).month;
tmpDate.day = (*baseDate).month;
gapDays = getDateToBase(baseDate, &tmpDate) - d; //计算出结果日期距离tmpDate的天数
return newDate(&tmpDate, gapDays); //gapDays >= 0, 调用newDate()计算出结果日期
}
}
/*
根据月份和天算出该日期在今年已过的天数
*/
static int getDays(myDate *date){
int day = (*date).day;
int leapyear = isLeapyear((*date).year); //判断当年是否为闰年
int days = 0;
//平年情况
days = preDays((*date).month) + day;
//闰年
if(leapyear && (*date).month > 2)
days++;
return days;
}
/*
根据月份和天算出该日期在今年还剩多少天
*/
static int getRestdays( myDate *date){
int leapyear = isLeapyear((*date).year);
int restdays;
if(leapyear)
restdays = YEAR_LEAP - getDays(date);
else
restdays = YEAR - getDays(date);
return restdays;
}
//判断是否是闰年,是则返回真
static int isLeapyear(int y){
if((y % 400 == 0 ) || (y % 4 == 0 && y % 100 != 0))
return 1;
else return 0;
}
//计算d天后的日期,d>0
static myDate newDate( myDate *today, int d){
int pastdays = getDays(today); //today年已过的天数
int gapDays = pastdays + d; //结果日期与today之间的天数
myDate newdate;
newdate.year = (*today).year;
newdate.month = 1;
newdate.day = 1;
if(d == 0)
return (*today);
else{
while(gapDays > getRestdays(&newdate) + 1){
gapDays = gapDays - getRestdays(&newdate) - 1;
newdate.year++;
newdate.month = 1;
newdate.day = 1;
}
//若为闰年
if(isLeapyear(newdate.year)){
if(gapDays <= preDays(2)){
newdate.month = 1;
newdate.day = gapDays;
}
else if(gapDays <= (preDays(3)+1)){
newdate.month = 2;
newdate.day = gapDays - preDays(2);
}
else if(gapDays <= (preDays(4)+1)){
newdate.month = 3;
newdate.day = gapDays - preDays(3) - 1;
}
else if(gapDays <= (preDays(5)+1)){
newdate.month = 4;
newdate.day = gapDays - preDays(4) - 1;
}
else if(gapDays <= (preDays(6)+1)){
newdate.month = 5;
newdate.day = gapDays - preDays(5) - 1;
}
else if(gapDays <= (preDays(7)+1)){
newdate.month = 6;
newdate.day = gapDays - preDays(6) - 1;
}
else if(gapDays <= (preDays(8)+1)){
newdate.month = 7;
newdate.day = gapDays - preDays(7) - 1;
}
else if(gapDays <= (preDays(9)+1)){
newdate.month = 8;
newdate.day = gapDays - preDays(8) - 1;
}
else if(gapDays <= (preDays(10)+1)){
newdate.month = 9;
newdate.day = gapDays - preDays(9) - 1;
}
else if(gapDays <= (preDays(11)+1)){
newdate.month = 10;
newdate.day = gapDays - preDays(10) - 1;
}
else if(gapDays <= (preDays(12)+1)){
newdate.month = 11;
newdate.day = gapDays - preDays(11) - 1;
}
else{
newdate.month = 12;
newdate.day = gapDays - preDays(12) - 1;
}
}
//平年
else{
if(gapDays <= preDays(2)){
newdate.month = 1;
newdate.day = gapDays;
}
else if(gapDays <= preDays(3)){
newdate.month = 2;
newdate.day = gapDays - preDays(2);
}
else if(gapDays <= preDays(4)){
newdate.month = 3;
newdate.day = gapDays - preDays(3);
}
else if(gapDays <= preDays(5)){
newdate.month = 4;
newdate.day = gapDays - preDays(4);
}
else if(gapDays <= preDays(6)){
newdate.month = 5;
newdate.day = gapDays - preDays(5);
}
else if(gapDays <= preDays(7)){
newdate.month = 6;
newdate.day = gapDays - preDays(6);
}
else if(gapDays <= preDays(8)){
newdate.month = 7;
newdate.day = gapDays - preDays(7);
}
else if(gapDays <= preDays(9)){
newdate.month = 8;
newdate.day = gapDays - preDays(8);
}
else if(gapDays <= preDays(10)){
newdate.month = 9;
newdate.day = gapDays - preDays(9);
}
else if(gapDays <= preDays(11)){
newdate.month = 10;
newdate.day = gapDays - preDays(10);
}
else if(gapDays <= preDays(12)){
newdate.month = 11;
newdate.day = gapDays - preDays(11);
}
else{
newdate.month = 12;
newdate.day = gapDays - preDays(12);
}
}
}
return newdate;
}
/*
判断两日期是否相同
*/
static int isEqual( myDate *date1, myDate *date2){
if((*date1).year == (*date2).year && (*date1).month == (*date2).month && (*date1).day == (*date2).day)
return 1;
else return 0;
}
- 1
- 2
- 3
前往页