QDateTime.time()精确度的“坑”

介绍

从Qt的帮助文档中可以看到,QDateTime提供了获取日期和时间的方法等。是QDate和QTime这两个类的组合。可以从当前系统获取时间,也可以进行增减时间,如秒、天、月、年。具体不再赘述,可以直接查看帮助文档。

QTime QDateTime::time() const

帮助文档中描述这个函数的作用是“Returns the time part of the datetime.”,即datetime中的时间部分,datetime包含年、月、日、时间(时刻),分别有不同的函数可以获取。函数作用描述得十分简洁。
但是如果用这个函数获取出来的QTime和一个定好的时间的QTime比较得话,会发现二者总是不相等。
例如:使用一个每秒刷新一次的函数来计时,判断是否到达“闹钟时间”。如下代码:

void Widget::updateTime()
{
    m_currentDateTime = QDateTime::currentDateTime();

    m_currentTimeLabel->setText(m_currentDateTime.toString());

    QDateTime targetTime = QDateTime::currentDateTime();
    targetTime.setTime(QTime(23, 26, 0));

    if (m_currentDateTime.time() == targetTime.time()) {
        qDebug() << "闹钟响了";
    }
    else {
        qDebug() << "闹钟时间未到";
    }
}

最终的测试效果发现“闹钟”并没有响。
原因是这个函数获取出来的QTime是默认将毫秒转换进去了,因此导致比较总是不相等。
查看源码,也可以发现比较明显的信息:
在这里插入图片描述
从上图可以看出在转化的时候调用了一个msecsToTime()的函数,将毫秒转换为QTime。
在这里插入图片描述
由于只是比较时间(精确到秒)的值是否相等,精确度要求不高,没有考虑到毫秒级,因此比较方便的方法是直接比较time().toString(),这样子它会转化为QString类型进行比较,而参数可以决定具体的形式(精确度)。如图所示:
在这里插入图片描述
而toString()的默认参数是Qt::TextDate,只精确到秒。

void Widget::updateTime()
{
    m_currentDateTime = QDateTime::currentDateTime();

    m_currentTimeLabel->setText(m_currentDateTime.toString());

    QDateTime targetTime = QDateTime::currentDateTime();
    targetTime.setTime(QTime(23, 31, 0));

    //这里增加了toString()的转换
    if (m_currentDateTime.time().toString() == targetTime.time().toString()) {
        qDebug() << "闹钟响了";
    }
    else {
        qDebug() << "闹钟时间未到";
    }
}

最终的时间比对是正常的:
在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值