QDateTime

QDateTime 是 Qt 框架中用于处理日期和时间的核心类,它结合了 QDate 和 QTime 的功能。

头文件

#include <QDateTime>

 

❶ 创建 QDateTime 对象

获取当前日期时间

// 获取当前日期时间(本地时间)
QDateTime currentDateTime = QDateTime::currentDateTime();
// 获取当前日期时间(UTC时间)
QDateTime currentDateTimeUtc = QDateTime::currentDateTimeUtc();

//注释:打断点是查看不了QDateTime的年月日时间的,要转成QString才能查看

手动指定日期和时间来创建

    //使用具体的日期和时间来创建
    QDate date(2023, 10, 15);//年,月,日
    QTime time(14, 30, 0);//时,分,秒
    QDateTime customDateTime(date, time);

从时间戳创建

//从自1970-01-01 00:00:00 UTC以来的毫秒数创建
qint64 msecs = 1697365800000;
QDateTime dateTimeFromEpoch = QDateTime::fromMSecsSinceEpoch(msecs);

❷ 获取日期时间信息

获取 QDateTime 中的日期和时间组成部分

    //获取 QDateTime 中的日期和时间组成部分
    QDateTime dt = QDateTime::currentDateTime();
    
    //获取日期部分
    QDate datePart = dt.date();
    int year = datePart.year();    //
    int month = datePart.month();  //
    int day = datePart.day();      ////获取时间部分
    QTime timePark = dt.time();
    int hour = timePark.hour();    //
    int minute = timePark.minute();//
    int second = timePark.second();//
    int msec = timePark.msec();   //毫秒

 

❸ 日期时间格式化与字符串转换

QDateTime 可以方便地与字符串相互转换:

//QDateTime 可以方便地与字符串相互转换:
QDateTime dt1 = QDateTime::currentDateTime();
QString str1 = dt1.toString();                              //默认格式
QString str2 = dt1.toString(Qt::ISODate);                    //ISO格式
QString str3 = dt1.toString("yyyy-MM-dd HH:mm:ss");            //自定义格式
QString str4 = dt1.toString("yyyy-MM-dd HH:mm:ss.zzz");        //自定义格式(带毫秒)
QString str5 = dt1.toString(codec->toUnicode("yyyy年MM月dd日 hh时mm分ss秒"));  //这里有个中文转换

下面是一些常用的格式符:

类别格式符含义与示例
yyyy 4位年份(2023)
  yy 2位年份(23)
MM 2位月份(01-12)
  MMM 月份缩写(Jan)
dd 2位日期(01-31)
  ddd 星期缩写(Mon)
HH 24小时制(00-23)
  hh 12小时制(01-12)
分秒 mm 分钟(00-59)
  ss 秒(00-59)
毫秒 zzz 毫秒(000-999)
上下午 AP/ap AM/PM 或 am/pm

 

从字符串解析

    // 从字符串解析
    QString dateTimeString = "2023-10-15 14:30:00";
    QDateTime parsedDateTime = QDateTime::fromString(dateTimeString, "yyyy-MM-dd HH:mm:ss");

    // 检查解析是否成功
    if (parsedDateTime.isValid()) {
        qDebug() << "解析成功:" << parsedDateTime;
    }
    else {
        qDebug() << "解析失败";
    }

❹ 日期时间计算与比较

    QDateTime dt = QDateTime::currentDateTime();

    // 添加时间
    QDateTime tomorrow = dt.addDays(1);           // 加1天
    QDateTime nextHour = dt.addSecs(3600);        // 加3600秒(1小时)
    QDateTime nextMonth = dt.addMonths(1);        // 加1个月
    QDateTime nextYear = dt.addYears(1);          // 加1年

    // 减去时间
    QDateTime yesterday = dt.addDays(-1);         // 减1天
    QDateTime prevMinute = dt.addSecs(-60);       // 减60秒

    // 计算时间差
    QDateTime dt1 = QDateTime::fromString("2023-10-15 10:00:00", "yyyy-MM-dd HH:mm:ss");
    QDateTime dt2 = QDateTime::fromString("2023-10-15 11:30:00", "yyyy-MM-dd HH:mm:ss");

    qint64 secsDiff = dt1.secsTo(dt2);            // 相差秒数:5400
    qint64 secsDiff1 = dt2.secsTo(dt1);            // 相差秒数:-5400
    qint64 daysDiff = dt1.daysTo(dt2);            // 相差天数:0(同一天)
    qint64 msecsDiff = dt1.msecsTo(dt2);          // 相差毫秒数:5400000

    // 比较操作
    if (dt1 < dt2) {
        qDebug() << "dt1 在 dt2 之前";
    }
    else if (dt1 == dt2) {
        qDebug() << "两个时间相同";
    }
    else {
        qDebug() << "dt1 在 dt2 之后";
    }

 

secsTo() 函数

特性

说明

功能​

计算当前 QDateTime对象到另一个 QDateTime对象 (other) 所经过的秒数

函数签名​

qint64 QDateTime::secsTo(const QDateTime &other) const

返回值​

从当前时间到 other时间的秒数差 (other - 当前时间)。结果为 qint64类型,可表示非常大的时间差。

返回值正负​

如果 other晚于当前时间,返回值为正数;如果 other早于当前时间,返回值为负数

 

 

 

核心概念与用法

  • 功能定义:secsTo()方法返回从当前 QDateTime对象到目标 QDateTime对象 (other) 所经过的秒数。简单来说,就是执行 other - 当前时间的操作

  • 参数与返回值:它接受一个 const QDateTime &类型的参数,代表要比较的目标时间。返回值类型是 qint64(一个有符号的64位整数),这确保了即使计算很长的时间跨度(例如几十年或几个世纪)也不会发生整数溢出

  • ⚠️ 重要注意事项

    1. 返回值的正负含义:务必注意,返回值的正负表示了两个时间的先后关系。正数意味着目标时间 (other) 在当前时间之后(未来);负数意味着目标时间在当前时间之前(过去)

      。例如,如果 currentTime.secsTo(futureTime)返回 300,表示未来时间还有300秒到达。
    2. msecsTo()的区别secsTo()返回的是,而 QDateTime还有一个 msecsTo()方法,它返回的是毫秒(千分之一秒)。在处理需要更高精度的计时场景时(如性能分析),应选用 msecsTo()

    3. 时间有效性:在调用此方法前,最好确保参与计算的两个 QDateTime对象都是有效的(通过 isValid()方法检查)。对无效的时间对象进行操作,结果将是未定义的

posted @ 2025-11-27 08:45  家煜宝宝  阅读(14)  评论(0)    收藏  举报