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系统时间转换成时间戳
四、结语
结果测试非常正确,如想测试,可进入测试时间差网站进行测试
相关文章
- Qt之QTimer
- 【Qt开发】事件循环与线程 一
- qt creator中输入中文中文变繁体
- Qt更新组件出现(“要继续此操作,至少需要一个有效且已启用的储存库”)
- Qt中子进程和父进程之间信号和槽通信
- PyQt(Python+Qt)学习随笔:树型部件QTreeWidget中的topLevelItem、indexOfTopLevelItem和takeTopLevelItem方法
- PyQt(Python+Qt)学习随笔:QListView的modelColumn属性及困惑
- PyQt(Python+Qt)学习随笔:Designer中QDialogButtonBox确认clicked信号是哪个按钮发送的方法
- PyQt(Python+Qt)学习随笔:Qt Designer中部件的enabled属性
- 56.Qt-滚动字幕之无间隙滚动
- 50.Qt-QJsonDocument读写json
- Qt 给顶层窗口和子控件添加阴影和圆角
- Qt - 锁屏界面加虚拟小键盘