zoukankan      html  css  js  c++  java
  • C/C++输入两个任意日期求相隔天数

    将两个日期转换成与一个指定日期(例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
    To:%s
    ",from,to);
    14 printf("%d
    ",days);
    15 system("pause");
    16 return 0;
    17 }

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

    2)convert函数的实现:

    1 time_t convert(int year,int month,int day)
    2 {
    3 tm info={0};
    4 info.tm_year=year-1900;
    5 info.tm_mon=month-1;
    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)/24/3600;
    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
    To:%s
    ", from, to);
    15     printf("%d
    ", days);
    16     system("pause");
    17     return 0;
    18 }
    19 
    20 time_t convert(int year, int month, int day)
    21 {
    22     tm info = {0};
    23     info.tm_year = year - 1900;
    24     info.tm_mon = month - 1;
    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) / 24 / 3600;
    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%4==0&&y%100!=0)||(y%400)==0);
     5 }
     6 
     7 //今年已过的天数(从1月1日算起)
     8 int GetNowDays(int y,int m,int d)
     9 {
    10     int days=0;
    11     switch(m-1)
    12     {
    13         case 11:
    14             days+=days+30;
    15         case 10:
    16             days+=days+31;
    17         case 9:
    18             days+=days+30;
    19         case 8:
    20             days+=days+31;
    21         case 7:
    22             days+=days+31;
    23         case 6:
    24             days+=days+30;
    25         case 5:
    26             days+=days+31;
    27         case 4:
    28             days+=days+30;
    29         case 3:
    30             days+=days+31;
    31         case 2:
    32             if(IsLeapYear(y))
    33                 days+=29;
    34             else
    35                 days+=28;
    36         case 1:
    37             days+=31;
    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 (366-GetNowDays(y,m,d));
    50     else
    51         return (365-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 0;
    60     if(strcmp(bgDate,exDate)>0)
    61         return 0;
    62     int by,bm,bd,ey,em,ed;
    63     int days=0;
    64     sscanf(bgDate,"%d-%d-%d",&by,&bm,&bd);
    65     sscanf(exDate,"%d-%d-%d",&ey,&em,&ed);
    66     
    67     if(ey-by>=1)
    68     {
    69         days+=((ey-(by+1))/4)*(365*3+366);
    70                 int tmp=(ey-(by+1))%4;
    71         for(int i=1;i<=tmp;++i)
    72         {
    73             if(IsLeapYear(by+1))
    74                 days+=366;
    75             else
    76                 days+=365;
    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

  • 相关阅读:
    hdu 4609 (FFT求解三角形)
    hdu 1402 FFT(模板)
    是因为Session只能让服务器在一次连续的会话中记住你,而Cookie是记住浏览器一段时间
    应该是实例化对象的没有对属性赋值时,自动赋值为null,但不是空指针对象引用
    一共有三种方式获取表单中的信息.第三种,容易忽视..用动作获取和用内置对象获取
    是不是总会有好享受的时候
    获取表单提交的信息在jsp页面只能用request对象。活着用超链接的URL传递参数,但是同样用request对象来获取
    不能解决,复选框在request对象获取的信息后显示在用户信息里面为中文的选项名
    jsp中向浏览器页面输出的方式总结
    mysql
  • 原文地址:https://www.cnblogs.com/fnlingnzb-learner/p/7054503.html
Copyright © 2011-2022 走看看