当前位置: 首页 > news >正文

Qt QDateTime时间部分显示为全0,QTime赋值后显示无效问题【已解决】

Qt QDateTime时间部分显示为全0,QTime赋值后显示无效问题

  • 引言
  • 一、问题描述
  • 二、解决方案
  • 三、深入源码
  • 四、参考链接

引言

QDateTime是Qt框架中用于处理日期和时间的类,它结合了QDate和QTime的功能,可以表示从公元1年1月1日到公元9999年12月31日的日期和时间。QDateTime支持时区转换、时间戳操作、日期时间格式化等功能,适用于需要同时处理日期和时间的场景。QTime是Qt中专门处理时间的类,仅表示一天内的时间(小时、分钟、秒、毫秒),不包含日期信息。适用于需要独立处理时间的场景,支持计算时间差,可判断时间是否有效 (isValid)。

一、问题描述

  • 打印一个QDateTime,时间部分显示为全0,经调试QTime显示无效,时间未赋值成功,问题如下所示:
    在这里插入图片描述
  • 问题原因为QTime赋值错误,超过其可表示的范围,可稳定复现的代码如下所示:
#include <QCoreApplication>
#include <QDateTime>
#include <QTime>
#include <QDebug>
int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QTime time;quint32 ms = 1000000;qDebug() << time.setHMS(1, 1, 1, ms);qDebug() << time;QDateTime dt = QDateTime::currentDateTime();dt.setTime(time);qDebug()<<dt;return a.exec();
}

二、解决方案

    1. 需在赋值前手动判断数值范围是否正确
    1. 根据赋值函数的返回值或isValid()判断时间是否有效
  • 官方文档:
    在这里插入图片描述

三、深入源码

    1. setHMS函数,就是把时分秒都转为毫秒存储起来. 只有是否有效的检测,其中NullTime = -1
bool QTime::setHMS(int h, int m, int s, int ms)
{if (!isValid(h,m,s,ms)) {mds = NullTime;                // make this invalidreturn false;}mds = (h*SECS_PER_HOUR + m*SECS_PER_MIN + s)*1000 + ms;return true;
}
    1. isValid将输入转为uint,再看取值是否符合实际范围.
bool QTime::isValid(int h, int m, int s, int ms)
{return (uint)h < 24 && (uint)m < 60 && (uint)s < 60 && (uint)ms < 1000;
}

四、参考链接

对QDateTime进行操作,使QDateTime::isNull() ==true:https://blog.csdn.net/xie__jin__cheng/article/details/146903868
QDateTime修改时区导致时间戳不对的坑:https://blog.csdn.net/doujianyoutiao/article/details/147953902
QDateTime类在C++中的应用与深度解析:https://blog.csdn.net/qq_21438461/article/details/132927850

http://www.lryc.cn/news/623307.html

相关文章:

  • ML307C 4G通信板:工业级DTU固件,多协议支持,智能配置管理
  • 随机整数列表处理:偶数索引降序排序
  • 数据库索引视角:对比二叉树到红黑树再到B树
  • 《探索IndexedDB实现浏览器端UTXO模型的前沿技术》
  • 使用影刀RPA实现快递信息抓取
  • C++ 最短路Dijkstra
  • 9.从零开始写LINUX内核——设置中断描述符表
  • Python 类元编程(元类的特殊方法 __prepare__)
  • Flink Stream API 源码走读 - 总结
  • 楼宇自控系统赋能建筑全维度管理,实现环境、安全与能耗全面监管
  • STM32硬件SPI配置为全双工模式下不要单独使用HAL_SPI_Transmit API及HAL_SPI_TransmitReceive改造方法
  • 【时时三省】(C语言基础)共用体类型数据的特点
  • Langfuse2.60.3:独立数据库+docker部署及环境变量详细说明
  • Java 中重载与重写的全面解析(更新版)
  • Mybatis-3自己实现MyBatis底层机制
  • 从冒泡到快速排序:探索经典排序算法的奥秘(二)
  • PHP反序列化的CTF题目环境和做题复现第1集
  • 企业运维规划及Linux介绍虚拟环境搭建
  • python---包
  • 一文速通Python并行计算:14 Python异步编程-协程的管理和调度
  • CF每日3题(1500-1700)
  • P2169 正则表达式
  • w嵌入式分享合集66
  • 【Bluedroid】A2DP控制通道UIPC机制深度解析(btif_a2dp_control_init)
  • Java8~Java21重要新特性
  • JAVA面试汇总(四)JVM(一)
  • 028 动静态库 —— 动态库
  • duiLib 实现鼠标拖动标题栏时,窗口跟着拖动
  • Vue 3.5重磅更新:响应式Props解构,让组件开发更简洁高效
  • 分享一个Oracle表空间自动扩容与清理脚本