• Qt QDateTime计算时间差


    Qt系列文章目录

    前言

    如果一个程序比较耗时,我们又想知道性能的瓶颈在哪里,然后针对性的进行优化。这里暂时不考虑多线程的情况。Qt中与时间相关的类大概有以下几个:
    1.QDateTime
    2.QTime
    3.QDate
    4.QTimeZone
    5.QCalendar
    是不是有点头大,反正我是懵圈了。。。。。。
    这篇文章主要聊聊QDateTime

    一、QDateTime

    QDateTime官方文档
    在这里插入图片描述

    二、常用的函数

    主要有以下常用函数
    在这里插入图片描述
    在这里插入图片描述
    从官网描述来看大概意思:QDateTime 对象编码日历日期和时钟时间(“日期时间”)。它结合了QDate和QTime类的特性。它可以从系统时钟中读取当前日期时间。它提供了比较日期时间和通过添加秒数、天数、月数或年数来操作日期时间的函数。

    1.示例代码

    #include "MainWindow.h"
    
    #include 
    #include 
    #include 
    #include 
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        MainWindow w;
    //    w.show();
    
    
    //    int iCount[10000000] = {1};
        int *pAllocation = new int[10000000];
        int item = 0;
        QDateTime time1 = QDateTime::currentDateTime();
        QTime startTime = QTime::currentTime();
        for(quint64 i=0; i<9000000000; i++)
        {
            item = i;
        }
    
        QDateTime time2 = QDateTime::currentDateTime();
        int days = time1.daysTo(time2);
        qDebug() << "Cast days=" << days;
    
        quint64 sTime = time1.toTime_t();
        quint64 eTime = time2.toTime_t();
    
        quint64 costTime = eTime - sTime;
        qDebug() << "eTime - sTime=" << costTime;
        QDateTime elapseTime = QDateTime::fromTime_t(costTime);
        qDebug() << "Elapsed time=" << elapseTime;
    
        QTime endTime = QTime::currentTime();
    
    
    
        int elapsed = startTime.secsTo(endTime);
        qDebug() << startTime.secsTo(endTime);
    
    
    //    int ndaysec = 24*60*60;
    //    qDebug() << "Day = " << (etime - stime)/(ndaysec) + ((etime - stime)%(ndaysec)+(ndaysec-1))/(ndaysec) - 1;
    
        QDateTime dateTime;
        QString elapsedTime = dateTime.fromTime_t(elapsed).toString("yyyy-MM-dd hh:mm:ss[:zzz]");
        qDebug() << "Cast time=" << elapsedTime;
    
        return a.exec();
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54

    注意如果考虑毫秒、微秒、纳秒级在计算时间差的时候,建议使用quint64,否则很容易溢出。
    另外boost当中的chrono也非常好用,而且精确度可以达到纳秒级,当然这里是考虑了cpu的时钟频率。

    #include 
    #define BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG		// 必须在头文件之前定义宏,否则无效!!!
    #include 
     
    int main(int argc, char **argv) {
    	// 第四个参数,如果精确度是微秒,单位就是微秒,如果精确度是纳秒,单位就是纳秒
    	boost::posix_time::time_duration td(1, 10, 30, 1000);				// 01:10:30
    	// 查看当前的精确度
    	if (td.resolution() == boost::date_time::nano) printf("精确度:纳秒\n");
    	else printf("精确度:微秒\n");
    	// 返回秒的小数部分的位数(微秒6位,纳秒9位)
    	std::cout << td.num_fractional_digits() << std::endl;
     
    	// 对于以下输出,默认微秒精度输出:01:10:30.001000  纳秒精度输出:01:10:30.000001000
    	std::cout << td << std::endl;
    	// 对于以下输出,在纳秒精度下,微秒会被忽略(微秒:4230001 纳秒:4230000)
    	std::cout << td.total_milliseconds() << std::endl;
    	// 下面的这个方法,就是输出小数点后面的数值,单位随精确度变化
    	std::cout << td.fractional_seconds() << std::endl;
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    2.日期与时间戳互转

    QString starttime ="2022-11-11 12:00:00";
    QString endtime = "2022-11-13 12:00:01";
    QDateTime start = QDateTime::fromString(starttime, "yyyy-MM-dd hh:mm:ss");
    QDateTime end = QDateTime::fromString(endtime, "yyyy-MM-dd hh:mm:ss");
    uint stime = start.toTime_t();
    uint etime = end.toTime_t();
    
    QDateTime time = QDateTime::fromTime_t(timeT); 
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
  • 相关阅读:
    写论文有哪些注意事项呢?
    并查集总结
    List详解
    深度学习最终BOSS——TensorRT
    I/O设备管理
    Springboot 程序实现加密,禁止 jadx 反编译
    软件测试2年,想去培训性能测试自动化测试,28岁了,要不要培训?
    【React】面试题5题
    编译原理网课笔记——第二章
    探索Java世界中的七大排序算法(上)
  • 原文地址:https://blog.csdn.net/aoxuestudy/article/details/126400211