QT计算两个日期之间的月份数

        数据库中单表数据存储量过大时,会造成数据库的查询统计速度变慢,因此需将单表数据拆分存储到按年月命名的多张数据表中。解决思路是获取单表中的最小时间和最大时间,然后计算两个时间中的月份数量,最后根据开始年月循环算出所有需要拆分的年月名称,生成对应的数据表名,并将对应年月的数据存储到多张数据表中。

        计算两个日期之间的相关函数如下:

// 计算两个日期之间的月份数
int Tools::MonthsBetween2Date(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)                 //如果年份相同,则返回月份相减数据
    {
        if(month1 == month2)
        {
            return 0;
        }
        else
        {
            return month1 > month2 ? month1 - month2 + 1 : month2 - month1 + 1;
        }
    }
    else                                                   //如果年份不同,则重新计算
    {
        if(year1 > year2)                                  //如果前方数据大于后方,这调换这两数据
        {
            swap(year1, year2);                            //按亦或算法交换两个数
            swap(month1, month2);
            swap(day1, day2);
        }
        int m1 = MonthInYear(month1);
        int m2 = 12 - MonthInYear(month2) + 1;
        int m3 = 0;
        for(int year = year1 + 1; year < year2; year++)
        {
            for(int k = month1; k <= 12; k++)
            {
                m3 += 1;
            }
        }
        return m1 + m2 + m3;
    }
}
//字符串转年月日
bool Tools::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;         //年天算法,判断数据解析是否符合日期规格
}
//判断是否是闰年
bool Tools::IsLeap(int year)
{
    return (year % 4 ==0 || year % 400 ==0) && (year % 100 !=0);                     //判断是否是润年
}
//计算一年中的剩余月份数量
int Tools::MonthInYear(int month)
{
    int intMonth = 0;
    for(int k = month; k <= 12; k++)
    {
        intMonth += 1;
    }
    return intMonth;
}
//交换两个数
void Tools::swap(int a,int b)
{
    a=a^b;
    b=a^b;
    a=a^b;
}

      举例:开始时间为2023-01-01 00:00:00,结束时间为2024-03-04 08:30:00,调用代码

QString date1 = "2023-01-01 00:00:00";
QString date2 = "2024-03-04 08:30:00";
int TotalMonth = MonthsBetween2Date(date1, date2);

  计算的出来的月份数量为15个月。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

疾风铸境

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值