C语言计算两个日期间的天数
碰到要计算两个日期之间是多少天是最麻烦的问题,所以写了这个函数,将就看看。需要注意的是,这个函数中没有把开始的那一天算在里面,如果需要请自行加1。
编辑平台是Arch Linux,gcc 4.5.0编译通过,执行正常,简单测试结果正确。
#include <stdlib.h> #include <math.h> #define LEAP 1 #define UNLEAP 0 // daycounter.h // includes the following functions: // int daycounter(struct date date1,struct date date2) // int same_year(struct date date1,struct date date2) // int diff_year(struct date date1,struct date date2) // int leap(int year) // int month_day(struct date month_day) // int day_last(struct date date1) // int day_past(struct date date2) // Writer infomation: // By: 陈志东 // From: 南京工业大学 // Email: njutczd@gmail.com //define a struct struct date{ int y,m,d; }; //test if the year is a leap year int leap (int year){ if (year%4 == 0 && year%100 != 0 || year%400 == 0) return LEAP; else return UNLEAP; } //give days of a month, test the 2nd month int month_day(struct date month_day){ switch(month_day.m){ case 1: case 3: case 5: case 7: case 8: case 10: case 12: return 31; break; case 4: case 6: case 9: case 11: return 30; break; case 2:{ if(leap(month_day.y)) return 29; else return 28; } break; default: exit(1); } } //while date1 and date2 in different years, return days from date1 to the end of that year int day_last(struct date date1){ int a=0,b=0; struct date i; a=month_day(date1)-date1.d; for(i.y=date1.y,i.m=date1.m+1,i.d=date1.d;i.m<=12;i.m++) b+=month_day(i); return a+b; } //while date1 and date2 in different years, return days from the beginning of that year to date2 int day_past(struct date date2){ int c=0,d=0; struct date i; c=date2.d; for(i.y=date2.y,i.m=1,i.d=1;i.m<=date2.m-1;i.m++) d+=month_day(i); return c+d; } //if date1 and date2 are in different years, use this fuction int diff_year(struct date date1, struct date date2){ int i,m=0,tmp; for(i=date1.y+1;i<=date2.y-1;i++){ if(leap(i)) tmp=366; else tmp=365; m+=tmp; } return day_last(date1)+m+day_past(date2); } //if date1 and date2 are in same year, use this fuction int same_year(struct date date1,struct date date2){ if(date1.m==date2.m) return date2.d-date1.d; else if(date1.m<date2.m){ int k=0; struct date i; for(i.y=date1.y,i.m=date1.m+1,i.d=date1.d;i.m<=date2.m-1;i.m++) k+=month_day(i); return month_day(date1)-date1.d+k+date2.d; } else exit(1);//month of date1 is later than month of date2 } //fuction to test if date1 and date2 are in same year and use the right fuction int daycounter(struct date date1,struct date date2){ if(date1.y==date2.y) return same_year(date1,date2); else if(date1.y<date2.y) return diff_year(date1,date2); else exit(1);//year of date1 is later than year of date2 }
下面是测试函数,调用daycounter.h中的int daycounter(struct date date1,struct date date2)函数计算两个日期间的天数。
#include <stdio.h> #include "daycounter.h" //daycounter.c //调用daycounter.h中的int daycounter(struct date date1,struct date date2)函数计算两个日期间的天数 int main(){ struct date date1,date2; printf("From date (xxxx.xx.xx):\t"); scanf("%d.%d.%d",&date1.y,&date1.m,&date1.d); printf("to date (xxxx.xx.xx):\t"); scanf("%d.%d.%d",&date2.y,&date2.m,&date2.d); //the dates entered should be test here to see if they are legal if((date1.m < 1 || date1.m > 12) ||(date2.m < 1 || date2.m > 12)){ printf("Month should between 1 to 12!\n"); return 1; } if((date1.d <1 || date1.d > month_day(date1)) || (date2.d <1 || date2.d > month_day(date2))){ printf("Please pay attention to the date you input!\n"); return 1; } if(date1.y>date2.y){ printf("The beginning year should before the ending year!\n"); return 1; } printf("Result is %d\n",daycounter(date1,date2)); return 0; }
如果您发现算法中有错误,请留言指正,谢谢!
上一篇: Arch Linux搭建SSH环境下一篇: 自己写的强力型字符转换长整型函数
[...] 这个问题在网上流传着众多算法和详细的代码实现,但是大部分都显得比较累赘且低效。比如我在Google的结果中找到的一个sampl(http://sillydong.com/myc/day-counter.html),写了80多行代码(减去了结构声明和头部注释)。 [...]