zoukankan      html  css  js  c++  java
  • Qt 计算两个日前间隔天数

    某一个大神写的

    改写了一点

    请无视注释

    //时间计算法则
    /***********************************************************************************************/
    bool Widget::IsLeap(int year)
    {
       return (year % 4 ==0 || year % 400 ==0) && (year % 100 !=0);                     //判断是否是软年
    }
    bool Widget::StringToDate(QString date ,int& year, int& month, int& day)            //数据解析
    {
        year = date.mid(0,4).toInt();                                                   //数据截取
        month = date.mid(4,2).toInt();                                                  //数据截取
        day = date.mid(6,2).toInt();                                                    //数据截取
    
        int DAY[12]={31,28,31,30,31,30,31,31,30,31,30,31};                              //初始化12个月份的数据
        if(IsLeap(year))                                                                //如果是闰年,那么将2月的数据更新为29天
        {
             DAY[1] = 29;
        }
        return year >= 0 && month<=12 && month>0 && day<=DAY[month-1] && day>0;         //日了狗了,写还不说给写个好的,这漏洞,差点出人命          //年天算法,判断数据解析是否符合日期规格
    }
    int Widget::DayInYear(int year, int month, int day)
    {
        int DAY[12]={31,28,31,30,31,30,31,31,30,31,30,31};
        if(IsLeap(year))
            DAY[1] = 29;
        for(int i=0; i<month - 1; ++i)
        {
            day += DAY[i];
        }
        return day;
    }
    int Widget::DaysBetween2Date(QString date1, QString date2)                                                                //主调函数
    {
                                                                                                                            //取出日期中的年月日
         int year1, month1, day1;
         int year2, month2, day2;
         if(!StringToDate(date1, year1, month1, day1) || !StringToDate(date2, year2,month2,day2))                           //调用截取函数
         {
            return -1;                                          //如果截取信息失败,那么将返回-1
         }
         if(year1 == year2 && month1 == month2)                 //如果年月相同,则返回相信日期相减数据
         {
              return day1 > day2 ? day1 - day2 : day2 - day1;
         }
         else if(year1 == year2)                                //如果年份相同,
         {
             int d1, d2;
             d1 = DayInYear(year1, month1, day1);               //调用月份年年份函数来获得数据
             d2 = DayInYear(year2, month2, day2);
             return d1 > d2 ? d1 - d2 : d2 - d1;
         }
         else                                                   //如果年份不同,这重新计算
         {
             if(year1 > year2)                                  //如果前方数据大于后方,这调换这两数据
             {
                 swap(year1, year2);                            //这里使用了高端的交换两个数的方法  按亦或算法写的
                 swap(month1, month2);
                 swap(day1, day2);
             }
             int d1,d2,d3;
             if(IsLeap(year1))
                 d1 = 366 - DayInYear(year1,month1, day1);
             else
                 d1 = 365 - DayInYear(year1,month1, day1);
             d2 = DayInYear(year2,month2,day2);
             d3 = 0;
             for(int year = year1 + 1; year < year2; year++)
             {
                 if(IsLeap(year))
                     d3 += 366;
                 else
                     d3 += 365;
             }
             return d1 + d2 + d3;
         }
    }
    void Widget::swap(int a,int b)                      //第一次使用这么高端的交换两个数
    {
        a=a^b;
        b=a^b;
        a=a^b;
    }
    /***********************************************************************************************/
    


  • 相关阅读:
    Android基础笔记(十八)- Fragment
    fedora20配置静态ip
    读《编程之美》励志篇
    官方教程Stealth学习笔记(一)
    从头认识Spring-2.4 基于java的标准注解装配-@Inject-限定器@Named
    POJ2186 Popular Cows [强连通分量|缩点]
    HDU2767Proving Equivalences[强连通分量 缩点]
    POJ1236Network of Schools[强连通分量|缩点]
    [USACO14OPEN] Dueling GPS's[最短路建模]
    洛谷2448 无尽的生命[树状数组 离散化]
  • 原文地址:https://www.cnblogs.com/DreamDog/p/9160155.html
Copyright © 2011-2022 走看看