两个日期之间的天数,一般用在分析物品是否过期,分析质量,或是有一种提示作用,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()< 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
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系统时间转换成时间戳
结果测试非常正确,如想测试,可进入测试时间差网站进行测试