zl程序教程

您现在的位置是:首页 >  工具

当前栏目

qt计算两个日期之间的差距天数

Qt日期计算 两个 之间 天数 差距
2023-09-27 14:29:08 时间

一、前言

两个日期之间的天数,一般用在分析物品是否过期,分析质量,或是有一种提示作用,qt本身当中并没有计算日期之间差的函数,百度了一下,找到了有牛人写好的方式,对其稍加改变,整理一下逻辑。核心源码参考链接:

https://blog.csdn.net/z609932088/article/details/47339439

二、环境

qt5.7 mingw编译器 

windows8系统

三、正文

主函数是DaysBetween2Date(day1,day2)

使用方式:

用day2-day1得出相差的天数,day2必须大于day1,否则返回-1,day的格式也有规范要求,最终进入到函数内部处理是解析出年月日,比如20191227,会拆分成年:2019,月:12,日:27,但是在输入端,有的时候有人可能不按照规范放日期,所以我在这里稍加处理,用字符串替换的方式,将带有“年、月、日、:、-”的字符去掉,最后日期进到函数内部,再用mid方式,解析出前8个数字(年月日),所以,在day的字符串中,日期必须是双位的,不能写成2019年9月8日,必须写成2019年09月08日才可以,否则函数返回-1,若年月日数值超出正常值,则函数返回-1,好了,下面直接上代码。

cpp

int DataCheck::DaysBetween2Date(QString date1, QString date2)                                                                //主调函数
{
                                                                                                                        //取出日期中的年月日
     int year1, month1, day1;
     int year2, month2, day2;
     QString datelast,datenow;
     datelast=date1;
     datenow=date2;
     QRegExp exp("[年月日-:-: ]");
     datelast =datelast.replace(exp,"");
     datenow =datenow.replace(exp,"");
     qDebug()<<datelast;
     qDebug()<<datenow;
     if(datenow<datelast)
     {
        return -1;
     }
     if(!StringToDate(datelast, year1, month1, day1) || !StringToDate(datenow, 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;
     }
}
bool DataCheck::IsLeap(int year)
{
   return (year % 4 ==0 || year % 400 ==0) && (year % 100 !=0);                     //判断是否是软年
}
bool DataCheck::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 DataCheck::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;
}
void DataCheck::swap(int a,int b)                      //第一次使用这么高端的交换两个数
{
    a=a^b;
    b=a^b;
    a=a^b;
}

h

    bool IsLeap(int year);
    bool StringToDate(QString date ,int& year, int& month, int& day);
    int DayInYear(int year, int month, int day);
    int DaysBetween2Date(QString date1, QString date2);
    void swap(int a,int b);


20221217更新,有更好更便捷的方式

参照如下

QT 计算两个日期时间差?(时间转时间戳)_Licht小粉的博客-CSDN博客_qt系统时间转换成时间戳

四、结语

结果测试非常正确,如想测试,可进入测试时间差网站进行测试