将两个日期转换成与一个指定日期(例1970-01-01)之间的差然后计算

思路:

两个日期相隔天数的计算,首先可以将两个日期转换成time_t(从指定日期至1970年1月1日0时0分0秒相隔的秒数),然后计算两个time_t的秒数差,最后用此秒数差除以24*3600秒就可以得到相隔的天数。所以程序中需要建立两个函数,一个是将日期转换成time_t的函数,一个是计算日期相隔天数的函数。

例:

1)建立程序的主体结构:

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. #include<math.h>
  5. #include<time.h>
  6. int get_days(const char* from, const char* to);
  7. time_t convert(int year,int month,int day);
  8. int main()
  9. {
  10. const char* from="2013-3-15";
  11. const char* to="2015-8-14";
  12. int days=get_days(from,to);
  13. printf("From:%s\nTo:%s\n",from,to);
  14. printf("%d\n",days);
  15. system("pause");
  16. return ;
  17. }

get_days函数是计算两个日期相隔天数的主要函数,主要实现从字符串中提取相应的数据和最后差值的计算;convert函数主要是将日期转换成秒值。两个函数的关系是get_day将会调用convert。

2)convert函数的实现:

  1. time_t convert(int year,int month,int day)
  2. {
  3. tm info={};
  4. info.tm_year=year-;
  5. info.tm_mon=month-;
  6. info.tm_mday=day;
  7. return mktime(&info);
  8. }

这里需要使用的是一个tm的结构体,该结构体包含很多信息,其中最为重要的就是年、月、日、时、分、秒。还有一个重要的内部函数就是mktime该函数可以将tm结构体转换成秒值也就是time_t类型。函数主要实现的方法就是新建一个tm结构体,然后将所有项赋值为0,再将年月日更新入tm结构体,最后使用mktime函数计算秒值并返回。

3)get_days函数的实现:

  1. int get_days(const char* from, const char* to)
  2. {
  3. int year,month,day;
  4. sscanf(from,"%d-%d-%d",&year,&month,&day);
  5. int fromSecond=(int)convert(year,month,day);
  6. sscanf(to,"%d-%d-%d",&year,&month,&day);
  7. int toSecond=(int)convert(year,month,day);
  8. return (toSecond-fromSecond)//;
  9. }

这个函数最为重要的就是使用sscanf命令完成字符串中数字部分的获取。一旦获取到年月日再代入函数convert就可计算出秒值,最后将两个秒值相减再除以一天的秒数即可得到结果。

完整程序:

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. #include<math.h>
  5. #include<time.h>
  6. int get_days(const char* from, const char* to);
  7. time_t convert(int year, int month, int day);
  8.  
  9. int main()
  10. {
  11. const char* from = "2013-3-15";
  12. const char* to = "2015-8-14";
  13. int days = get_days(from, to);
  14. printf("From:%s\nTo:%s\n", from, to);
  15. printf("%d\n", days);
  16. system("pause");
  17. return ;
  18. }
  19.  
  20. time_t convert(int year, int month, int day)
  21. {
  22. tm info = {};
  23. info.tm_year = year - ;
  24. info.tm_mon = month - ;
  25. info.tm_mday = day;
  26. return mktime(&info);
  27. }
  28.  
  29. int get_days(const char* from, const char* to)
  30. {
  31. int year, month, day;
  32. sscanf(from, "%d-%d-%d", &year, &month, &day);
  33. int fromSecond = (int) convert(year, month, day);
  34. sscanf(to, "%d-%d-%d", &year, &month, &day);
  35. int toSecond = (int) convert(year, month, day);
  36. return (toSecond - fromSecond) / / ;
  37. }

直接计算

思路:

比如输入2001/03/23--2013/12/11,分成三段,2001/03/23--2001/12/31,2002年初到2012年底,2013/01/01--2013/12/11.只要判断第二段中是否有闰年即可。

代码:

  1. //是否闰年
  2. bool IsLeapYear(int y)
  3. {
  4. return ((y%==&&y%!=)||(y%)==);
  5. }
  6.  
  7. //今年已过的天数(从1月1日算起)
  8. int GetNowDays(int y,int m,int d)
  9. {
  10. int days=;
  11. switch(m-)
  12. {
  13. case :
  14. days+=days+;
  15. case :
  16. days+=days+;
  17. case :
  18. days+=days+;
  19. case :
  20. days+=days+;
  21. case :
  22. days+=days+;
  23. case :
  24. days+=days+;
  25. case :
  26. days+=days+;
  27. case :
  28. days+=days+;
  29. case :
  30. days+=days+;
  31. case :
  32. if(IsLeapYear(y))
  33. days+=;
  34. else
  35. days+=;
  36. case :
  37. days+=;
  38. default:
  39. days+=d;
  40. break;
  41. }
  42. return days;
  43. }
  44.  
  45. //今年剩余天数
  46. int GetRemainDays(int y,int m,int d)
  47. {
  48. if(IsLeapYear(y))
  49. return (-GetNowDays(y,m,d));
  50. else
  51. return (-GetNowDays(y,m,d));
  52. }
  53.  
  54. //日期格式为yyyy-mm-dd
  55. //求两个日期之间的相隔天数
  56. int GetExDays(const char* bgDate,const char* exDate)
  57. {
  58. if(bgDate==NULL||exDate==NULL)
  59. return ;
  60. if(strcmp(bgDate,exDate)>)
  61. return ;
  62. int by,bm,bd,ey,em,ed;
  63. int days=;
  64. sscanf(bgDate,"%d-%d-%d",&by,&bm,&bd);
  65. sscanf(exDate,"%d-%d-%d",&ey,&em,&ed);
  66.  
  67. if(ey-by>=)
  68. {
  69. days+=((ey-(by+))/)*(*+);
  70. int tmp=(ey-(by+))%;
  71. for(int i=;i<=tmp;++i)
  72. {
  73. if(IsLeapYear(by+))
  74. days+=;
  75. else
  76. days+=;
  77. }
  78. days+=(GetRemainDays(by,bm,bd)+GetNowDays(ey,em,ed));
  79. }else
  80. {
  81. days+=(GetNowDays(ey,em,ed)-GetNowDays(by,bm,bd));
  82. }
  83. return days;
  84. }

转载请注明出处:http://www.cnblogs.com/fnlingnzb-learner/p/7054503.html

C/C++输入两个任意日期求相隔天数的更多相关文章

  1. ytu 1057: 输入两个整数,求他们相除的余数(带参的宏 + 模板函数 练习)

    1057: 输入两个整数,求他们相除的余数 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 177  Solved: 136[Submit][Status ...

  2. Java计算两个字符串日期之间的天数差

    Java计算两个字符串日期之间的天数差 调用方法: public static void main(String[] args) throws ParseException { String a = ...

  3. javascript中计算两个时间日期间隔的天数

    <script>              /*                  计算两个日期的时间间隔天数              */              //时间字符串的格 ...

  4. 比较两个data日期之间的天数相差

    先将字符串转化为Date类型 转化方式参看:http://blog.csdn.net/caoyinghui1986/archive/2008/04/18/2303570.aspx 然后在调用Date. ...

  5. js-获取两个字符串日期的相隔周

    例如说"2017-04-01 23:00:00"是周六, "2017-04-28 23:00:00"是周五,包含各自所在的那一周,我真正需要获得的结果是5个周. ...

  6. c#(asp.net) 如何计算两个日期之间相隔天数

    1.DateTime t1 = Convert.ToDateTime("2006-1-6"); DateTime t2 = Convert.ToDateTime("200 ...

  7. C#计算两个日期的相隔天数

    DateTime start = Convert.ToDateTime(dateStart.ToShortDateString()); DateTime end = Convert.ToDateTim ...

  8. c++作业:输入两个整数,用函数求两数之和。函数外部声明有什么作用?

    #include <iostream> using namespace std; int main(){ //求两数的和? int a,b,s; cout<<"请你输 ...

  9. 输入两个整数n 和m,从数列1,2,3.......n 中任意取几个数, 使其和等于m ,要求将当中全部的可能组合列出来

    中兴面试题之中的一个.难度系数中. 题目描写叙述例如以下:输入两个整数n 和m,从数列1,2.3.......n 中任意取几个数, 使其和等于m ,要求将当中全部的可能组合列出来. 逻辑分析: 1.比 ...

随机推荐

  1. Servlet实现简单的登录页面

    package emp; import java.io.IOException; import java.io.PrintWriter; import java.sql.Connection; imp ...

  2. 最长公共子序列poj1458

    #include<map> #include<set> #include<list> #include<cmath> #include<queue ...

  3. Java AOP (1) compile time weaving 【Java 切面编程 (1) 编译期织入】

    According to wikipedia  aspect-oriented programming (AOP) is a programming paradigm that aims to inc ...

  4. OC点语法介绍和使用以及@property关键字

    使用"点语法" Person *p =[Person new]; //点语法 //对象.属性名 //注意,此时 (p.age)并不是直接方法实例对象 //而是xcode可能到点语法 ...

  5. Docker基于已有的镜像制新的镜像

    1.根据运行的容器制作镜像 #查看所有的容器 docker ps #暂停当前容器 docker pause COTNAINER-ID #将容器运行当前状态提交 docker commit COTNAI ...

  6. Python冒泡算法和修改配置文件

    先学习之前未完成的冒泡算法 li = [13,22,6,99,11] 从小到大 从第一个数字比较把大的往后移位 for m in range(4): num1 = li[m] num2 = li[m+ ...

  7. 转:MySQL表名不区分大小写

    在LINUX下调一个程序老说找不到表,但是我明明是建了表的,在MYSQL的命令行下也可以查到,为什么程序就找不到表呢? 一.linux中mysql大小写详情: 1.数据库名严格区分大小写 2.表名严格 ...

  8. Python数据类型和变量

    一.数据类型1.整型整型类型比较简单,就是我们数学中的正整数(1,2,520..).负整数(-2,-9..);与java不同的是,python中的整数可以无限大,而java的整数类型int为四个字节, ...

  9. springboot(二):web综合开发

    上篇文章介绍了spring boot初级教程:spring boot(一):入门篇,方便大家快速入门.了解实践Spring boot特性:本篇文章接着上篇内容继续为大家介绍spring boot的其它 ...

  10. DDD领域驱动 (一)

    说道DDD不得不说传统的架构与DDD的架构区别. 传统的架构不外乎就是三层,而在这三层里面又不断的细分,始终没有达到想要的效果,那么为什么当时还是采用三层. 当然在DDD没有提出的时候三层是大多数人的 ...