C/C++完成两个日期之间相隔天数的计算
两个日期之间相隔天数的计算网上有许多的软件,这里主要介绍如何使用C/C++语言来完成这样的功能。
程序编写的主要思路
- 01
两个日期相隔天数的计算,首先可以将两个日期转换成time_t(从指定日期至1970年1月1日0时0分0秒相隔的秒数),然后计算两个time_t的秒数差,最后用此秒数差除以24*3600秒就可以得到相隔的天数。所以程序中需要建立两个函数,一个是将日期转换成time_t的函数,一个是计算日期相隔天数的函数。
程序的具体实现
- 01
建立程序的主体结构: #include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> #include<time.h> int get_days(const char* from, const char* to); time_t convert(int year,int month,int day); int main() { const char* from="2013-3-15"; const char* to="2015-8-14"; int days=get_days(from,to); printf("From:%s\nTo:%s\n",from,to); printf("%d\n",days); system("pause"); return 0; } get_days函数是计算两个日期相隔天数的主要函数,主要实现从字符串中提取相应的数据和最后差值的计算;convert函数主要是将日期转换成秒值。两个函数的关系是get_day将会调用convert。
- 02
convert函数的实现: time_t convert(int year,int month,int day) { tm info={0}; info.tm_year=year-1900; info.tm_mon=month-1; info.tm_mday=day; return mktime(&info); } 这里需要使用的是一个tm的结构体,该结构体包含很多信息,其中最为重要的就是年、月、日、时、分、秒。还有一个重要的内部函数就是mktime该函数可以将tm结构体转换成秒值也就是time_t类型。函数主要实现的方法就是新建一个tm结构体,然后将所有项赋值为0,再将年月日更新入tm结构体,最后使用mktime函数计算秒值并返回。
- 03
get_days函数的实现: int get_days(const char* from, const char* to) { int year,month,day; sscanf(from,"%d-%d-%d",&year,&month,&day); int fromSecond=(int)convert(year,month,day); sscanf(to,"%d-%d-%d",&year,&month,&day); int toSecond=(int)convert(year,month,day); return (toSecond-fromSecond)/24/3600; } 这个函数最为重要的就是使用sscanf命令完成字符串中数字部分的获取。一旦获取到年月日再代入函数convert就可计算出秒值,最后将两个秒值相减再除以一天的秒数即可得到结果。
- 04
完整的程序: #include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> #include<time.h> int get_days(const char* from, const char* to); time_t convert(int year,int month,int day); int main() { const char* from="2013-3-15"; const char* to="2015-8-14"; int days=get_days(from,to); printf("From:%s\nTo:%s\n",from,to); printf("%d\n",days); system("pause"); return 0; } time_t convert(int year,int month,int day) { tm info={0}; info.tm_year=year-1900; info.tm_mon=month-1; info.tm_mday=day; return mktime(&info); } int get_days(const char* from, const char* to) { int year,month,day; sscanf(from,"%d-%d-%d",&year,&month,&day); int fromSecond=(int)convert(year,month,day); sscanf(to,"%d-%d-%d",&year,&month,&day); int toSecond=(int)convert(year,month,day); return (toSecond-fromSecond)/24/3600; }
- 05
运行结果可以看出2013-3-15到2015-8-14一共相隔882天。