Qt 计算两个日前间隔天数

举报
DreamLife 发表于 2022/04/16 00:05:05 2022/04/16
【摘要】 某一个大神写的   改写了一点     请无视注释     //时间计算法则/***********************************************************************************************/b...

某一个大神写的

 

改写了一点

 

 

请无视注释

 

 


  
  1. //时间计算法则
  2. /***********************************************************************************************/
  3. bool Widget::IsLeap(int year)
  4. {
  5. return (year % 4 ==0 || year % 400 ==0) && (year % 100 !=0); //判断是否是软年
  6. }
  7. bool Widget::StringToDate(QString date ,int& year, int& month, int& day) //数据解析
  8. {
  9. year = date.mid(0,4).toInt(); //数据截取
  10. month = date.mid(4,2).toInt(); //数据截取
  11. day = date.mid(6,2).toInt(); //数据截取
  12. int DAY[12]={31,28,31,30,31,30,31,31,30,31,30,31}; //初始化12个月份的数据
  13. if(IsLeap(year)) //如果是闰年,那么将2月的数据更新为29天
  14. {
  15. DAY[1] = 29;
  16. }
  17. return year >= 0 && month<=12 && month>0 && day<=DAY[month-1] && day>0; //日了狗了,写还不说给写个好的,这漏洞,差点出人命 //年天算法,判断数据解析是否符合日期规格
  18. }
  19. int Widget::DayInYear(int year, int month, int day)
  20. {
  21. int DAY[12]={31,28,31,30,31,30,31,31,30,31,30,31};
  22. if(IsLeap(year))
  23. DAY[1] = 29;
  24. for(int i=0; i<month - 1; ++i)
  25. {
  26. day += DAY[i];
  27. }
  28. return day;
  29. }
  30. int Widget::DaysBetween2Date(QString date1, QString date2) //主调函数
  31. {
  32. //取出日期中的年月日
  33. int year1, month1, day1;
  34. int year2, month2, day2;
  35. if(!StringToDate(date1, year1, month1, day1) || !StringToDate(date2, year2,month2,day2)) //调用截取函数
  36. {
  37. return -1; //如果截取信息失败,那么将返回-1
  38. }
  39. if(year1 == year2 && month1 == month2) //如果年月相同,则返回相信日期相减数据
  40. {
  41. return day1 > day2 ? day1 - day2 : day2 - day1;
  42. }
  43. else if(year1 == year2) //如果年份相同,
  44. {
  45. int d1, d2;
  46. d1 = DayInYear(year1, month1, day1); //调用月份年年份函数来获得数据
  47. d2 = DayInYear(year2, month2, day2);
  48. return d1 > d2 ? d1 - d2 : d2 - d1;
  49. }
  50. else //如果年份不同,这重新计算
  51. {
  52. if(year1 > year2) //如果前方数据大于后方,这调换这两数据
  53. {
  54. swap(year1, year2); //这里使用了高端的交换两个数的方法 按亦或算法写的
  55. swap(month1, month2);
  56. swap(day1, day2);
  57. }
  58. int d1,d2,d3;
  59. if(IsLeap(year1))
  60. d1 = 366 - DayInYear(year1,month1, day1);
  61. else
  62. d1 = 365 - DayInYear(year1,month1, day1);
  63. d2 = DayInYear(year2,month2,day2);
  64. d3 = 0;
  65. for(int year = year1 + 1; year < year2; year++)
  66. {
  67. if(IsLeap(year))
  68. d3 += 366;
  69. else
  70. d3 += 365;
  71. }
  72. return d1 + d2 + d3;
  73. }
  74. }
  75. void Widget::swap(int a,int b) //第一次使用这么高端的交换两个数
  76. {
  77. a=a^b;
  78. b=a^b;
  79. a=a^b;
  80. }
  81. /***********************************************************************************************/


 

 

 

文章来源: dreamlife.blog.csdn.net,作者:DreamLife.,版权归原作者所有,如需转载,请联系作者。

原文链接:dreamlife.blog.csdn.net/article/details/47339439

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。