C/C++输入两个任意日期求相隔天数
将两个日期转换成与一个指定日期(例1970-01-01)之间的差然后计算
思路:
两个日期相隔天数的计算,首先可以将两个日期转换成time_t(从指定日期至1970年1月1日0时0分0秒相隔的秒数),然后计算两个time_t的秒数差,最后用此秒数差除以24*3600秒就可以得到相隔的天数。所以程序中需要建立两个函数,一个是将日期转换成time_t的函数,一个是计算日期相隔天数的函数。
例:
1)建立程序的主体结构:
- #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 ;
- }
get_days函数是计算两个日期相隔天数的主要函数,主要实现从字符串中提取相应的数据和最后差值的计算;convert函数主要是将日期转换成秒值。两个函数的关系是get_day将会调用convert。
2)convert函数的实现:
- time_t convert(int year,int month,int day)
- {
- tm info={};
- info.tm_year=year-;
- info.tm_mon=month-;
- info.tm_mday=day;
- return mktime(&info);
- }
这里需要使用的是一个tm的结构体,该结构体包含很多信息,其中最为重要的就是年、月、日、时、分、秒。还有一个重要的内部函数就是mktime该函数可以将tm结构体转换成秒值也就是time_t类型。函数主要实现的方法就是新建一个tm结构体,然后将所有项赋值为0,再将年月日更新入tm结构体,最后使用mktime函数计算秒值并返回。
3)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)//;
- }
这个函数最为重要的就是使用sscanf命令完成字符串中数字部分的获取。一旦获取到年月日再代入函数convert就可计算出秒值,最后将两个秒值相减再除以一天的秒数即可得到结果。
完整程序:
- #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 ;
- }
- time_t convert(int year, int month, int day)
- {
- tm info = {};
- info.tm_year = year - ;
- info.tm_mon = month - ;
- 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) / / ;
- }
直接计算
思路:
比如输入2001/03/23--2013/12/11,分成三段,2001/03/23--2001/12/31,2002年初到2012年底,2013/01/01--2013/12/11.只要判断第二段中是否有闰年即可。
代码:
- //是否闰年
- bool IsLeapYear(int y)
- {
- return ((y%==&&y%!=)||(y%)==);
- }
- //今年已过的天数(从1月1日算起)
- int GetNowDays(int y,int m,int d)
- {
- int days=;
- switch(m-)
- {
- case :
- days+=days+;
- case :
- days+=days+;
- case :
- days+=days+;
- case :
- days+=days+;
- case :
- days+=days+;
- case :
- days+=days+;
- case :
- days+=days+;
- case :
- days+=days+;
- case :
- days+=days+;
- case :
- if(IsLeapYear(y))
- days+=;
- else
- days+=;
- case :
- days+=;
- default:
- days+=d;
- break;
- }
- return days;
- }
- //今年剩余天数
- int GetRemainDays(int y,int m,int d)
- {
- if(IsLeapYear(y))
- return (-GetNowDays(y,m,d));
- else
- return (-GetNowDays(y,m,d));
- }
- //日期格式为yyyy-mm-dd
- //求两个日期之间的相隔天数
- int GetExDays(const char* bgDate,const char* exDate)
- {
- if(bgDate==NULL||exDate==NULL)
- return ;
- if(strcmp(bgDate,exDate)>)
- return ;
- int by,bm,bd,ey,em,ed;
- int days=;
- sscanf(bgDate,"%d-%d-%d",&by,&bm,&bd);
- sscanf(exDate,"%d-%d-%d",&ey,&em,&ed);
- if(ey-by>=)
- {
- days+=((ey-(by+))/)*(*+);
- int tmp=(ey-(by+))%;
- for(int i=;i<=tmp;++i)
- {
- if(IsLeapYear(by+))
- days+=;
- else
- days+=;
- }
- days+=(GetRemainDays(by,bm,bd)+GetNowDays(ey,em,ed));
- }else
- {
- days+=(GetNowDays(ey,em,ed)-GetNowDays(by,bm,bd));
- }
- return days;
- }
转载请注明出处:http://www.cnblogs.com/fnlingnzb-learner/p/7054503.html
C/C++输入两个任意日期求相隔天数的更多相关文章
- ytu 1057: 输入两个整数,求他们相除的余数(带参的宏 + 模板函数 练习)
1057: 输入两个整数,求他们相除的余数 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 177 Solved: 136[Submit][Status ...
- Java计算两个字符串日期之间的天数差
Java计算两个字符串日期之间的天数差 调用方法: public static void main(String[] args) throws ParseException { String a = ...
- javascript中计算两个时间日期间隔的天数
<script> /* 计算两个日期的时间间隔天数 */ //时间字符串的格 ...
- 比较两个data日期之间的天数相差
先将字符串转化为Date类型 转化方式参看:http://blog.csdn.net/caoyinghui1986/archive/2008/04/18/2303570.aspx 然后在调用Date. ...
- js-获取两个字符串日期的相隔周
例如说"2017-04-01 23:00:00"是周六, "2017-04-28 23:00:00"是周五,包含各自所在的那一周,我真正需要获得的结果是5个周. ...
- c#(asp.net) 如何计算两个日期之间相隔天数
1.DateTime t1 = Convert.ToDateTime("2006-1-6"); DateTime t2 = Convert.ToDateTime("200 ...
- C#计算两个日期的相隔天数
DateTime start = Convert.ToDateTime(dateStart.ToShortDateString()); DateTime end = Convert.ToDateTim ...
- c++作业:输入两个整数,用函数求两数之和。函数外部声明有什么作用?
#include <iostream> using namespace std; int main(){ //求两数的和? int a,b,s; cout<<"请你输 ...
- 输入两个整数n 和m,从数列1,2,3.......n 中任意取几个数, 使其和等于m ,要求将当中全部的可能组合列出来
中兴面试题之中的一个.难度系数中. 题目描写叙述例如以下:输入两个整数n 和m,从数列1,2.3.......n 中任意取几个数, 使其和等于m ,要求将当中全部的可能组合列出来. 逻辑分析: 1.比 ...
随机推荐
- Servlet实现简单的登录页面
package emp; import java.io.IOException; import java.io.PrintWriter; import java.sql.Connection; imp ...
- 最长公共子序列poj1458
#include<map> #include<set> #include<list> #include<cmath> #include<queue ...
- Java AOP (1) compile time weaving 【Java 切面编程 (1) 编译期织入】
According to wikipedia aspect-oriented programming (AOP) is a programming paradigm that aims to inc ...
- OC点语法介绍和使用以及@property关键字
使用"点语法" Person *p =[Person new]; //点语法 //对象.属性名 //注意,此时 (p.age)并不是直接方法实例对象 //而是xcode可能到点语法 ...
- Docker基于已有的镜像制新的镜像
1.根据运行的容器制作镜像 #查看所有的容器 docker ps #暂停当前容器 docker pause COTNAINER-ID #将容器运行当前状态提交 docker commit COTNAI ...
- Python冒泡算法和修改配置文件
先学习之前未完成的冒泡算法 li = [13,22,6,99,11] 从小到大 从第一个数字比较把大的往后移位 for m in range(4): num1 = li[m] num2 = li[m+ ...
- 转:MySQL表名不区分大小写
在LINUX下调一个程序老说找不到表,但是我明明是建了表的,在MYSQL的命令行下也可以查到,为什么程序就找不到表呢? 一.linux中mysql大小写详情: 1.数据库名严格区分大小写 2.表名严格 ...
- Python数据类型和变量
一.数据类型1.整型整型类型比较简单,就是我们数学中的正整数(1,2,520..).负整数(-2,-9..);与java不同的是,python中的整数可以无限大,而java的整数类型int为四个字节, ...
- springboot(二):web综合开发
上篇文章介绍了spring boot初级教程:spring boot(一):入门篇,方便大家快速入门.了解实践Spring boot特性:本篇文章接着上篇内容继续为大家介绍spring boot的其它 ...
- DDD领域驱动 (一)
说道DDD不得不说传统的架构与DDD的架构区别. 传统的架构不外乎就是三层,而在这三层里面又不断的细分,始终没有达到想要的效果,那么为什么当时还是采用三层. 当然在DDD没有提出的时候三层是大多数人的 ...