当前位置: 首页 > 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.dtcms.com/a/334274.html

相关文章:

  • 从零开始大模型之实现GPT模型
  • 黑板架构详解
  • Wi-Fi 7 将如何重塑互联工作场所
  • 链式二叉树的基本操作——遍历
  • 《从入门到高可用:2025最新MySQL 8.0全栈速通指南》
  • docker-compose-mysql-定时备份数据库到其他服务器脚本
  • SpringBoot 集成Ollama 本地大模型
  • mysql的group by函数怎么使用
  • Java内功修炼(1)——时光机中的并发革命:从单任务到Java多线程
  • [Linux] Linux文件系统基本管理
  • 基于STM32的精确按键时长测量系统
  • 一周学会Matplotlib3 Python 数据可视化-绘制自相关图
  • 2020/12 JLPT听力原文 问题二 2番
  • Pycaita二次开发基础代码解析:交互选择、参数化建模与球体创建的工业级实现
  • 415. 字符串相加
  • dify 调用本地的 stable diffusion api生成图片的工作流搭建
  • 分布式存储与存储阵列:从传统到现代的存储革命
  • Windows Manager:全方位优化你的Windows系统
  • PCB高频板与普通电路板的核心差异
  • JavaScript 闭包与递归深度解析:从理论到实战
  • [优选算法专题二滑动窗口——最大连续1的个数 III]
  • 【轨物方案】预防性运维:轨物科技用AI+机器人重塑光伏电站价值链
  • K8S的ingress
  • 石头科技披露半年报:营收79.03亿元,同比大增78.96%
  • vscode中用python调用matlab的函数(环境安装)
  • pdf合并代码
  • Autosar Os新手入门
  • IOMMU多级页表查找的验证
  • 从0到1掌握 Spring Security(第三篇):三种认证方式,按配置一键切换
  • Flink Stream API 源码走读 - print()