【Qt】Qt时间操作与处理方法汇总

Qt中处理时间主要涉及以下几个核心类:QDateTimeQDateQTimeQTimerQElapsedTimer


1. 获取当前日期和时间

// 当前日期和时间
QDateTime currentDateTime = QDateTime::currentDateTime();

// 当前日期
QDate currentDate = QDate::currentDate();

// 当前时间
QTime currentTime = QTime::currentTime();

2. 格式化时间输出

使用 toString() 按指定格式输出:

QString dateStr = currentDate.toString("yyyy-MM-dd");      // 2023-08-23
QString timeStr = currentTime.toString("hh:mm:ss.zzz");   // 14:30:45.123
QString dateTimeStr = currentDateTime.toString("yyyy-MM-dd hh:mm:ss");

3. 时间计算

// 日期加减
QDate newDate = currentDate.addDays(5);    // 加5天
QDate prevMonth = currentDate.addMonths(-1); // 减1个月

// 时间加减
QTime newTime = currentTime.addSecs(3600); // 加1小时(3600秒)

// 日期时间差(秒)
qint64 secsBetween = QDateTime::currentDateTime().secsTo(targetDateTime);

4. 时间比较

if (time1 < time2) {
    qDebug() << "time1 早于 time2";
}
if (date1 == date2) {
    qDebug() << "日期相同";
}

5. 从字符串解析时间

QDate date = QDate::fromString("2023-08-23", "yyyy-MM-dd");
QTime time = QTime::fromString("14:30:00", "hh:mm:ss");
QDateTime dt = QDateTime::fromString("2023-08-23 14:30", "yyyy-MM-dd hh:mm");

6. 定时器(QTimer)

单次触发:

QTimer::singleShot(3000, []() {
    qDebug() << "3秒后执行";
});

周期性触发:

QTimer *timer = new QTimer(this);
connect(timer, &QTimer::timeout, this, &MyClass::updateUI);
timer->start(1000); // 每秒触发一次

7. 高精度计时(QElapsedTimer)

测量代码执行时间:

QElapsedTimer timer;
timer.start(); // 开始计时

// 执行耗时操作...
doHeavyWork();

qint64 elapsedMs = timer.elapsed(); // 获取毫秒数
qDebug() << "耗时:" << elapsedMs << "毫秒";

8. 时区处理

// 设置时区(东八区)
QTimeZone timeZone(8 * 3600);
QDateTime beijingTime = QDateTime::currentDateTime().toTimeZone(timeZone);

// UTC时间
QDateTime utcTime = QDateTime::currentDateTimeUtc();

9. 时间戳转换

// 获取时间戳(秒)
qint64 timestampSec = QDateTime::currentSecsSinceEpoch();

// 时间戳转QDateTime
QDateTime dt = QDateTime::fromSecsSinceEpoch(timestampSec);

10. 日期有效性检查

QDate invalidDate(2023, 2, 30); // 无效日期(2月无30日)
if (!invalidDate.isValid()) {
    qDebug() << "日期无效!";
}

完整示例:倒计时器

// 在头文件中声明
private slots:
    void updateCountdown();

// 在.cpp中实现
void MyClass::startCountdown(int seconds) {
    QTimer *timer = new QTimer(this);
    connect(timer, &QTimer::timeout, this, [=]() {
        seconds--;
        if (seconds <= 0) {
            timer->stop();
            qDebug() << "倒计时结束!";
        } else {
            qDebug() << "剩余:" << seconds << "秒";
        }
    });
    timer->start(1000); // 每秒更新
}

关键说明

  • 日期格式符
    yyyy-年、MM-月、dd-日、hh-小时(12h制)、HH-小时(24h制)、mm-分、ss-秒、zzz-毫秒。
  • 跨平台支持:Qt时间类在所有平台(Windows/Linux/macOS)行为一致。
  • 线程安全QTimer 需在主线程使用,跨线程用 QMetaObject::invokeMethod

你可能感兴趣的:(Qt基础,c++,qt,开发语言)