当前位置: 首页 > 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.xdnf.cn/news/1309519.html

相关文章:

  • 【C++】C++11
  • Maven私服配置模版
  • 深入详解PCB布局布线技巧-去耦电容的摆放位置
  • IOMMU的2级地址翻译机制及多级(2~5)页表查找
  • Python 项目高频设计模式实战指南:从理念到落地的全景剖析
  • 电路方案分析(二十一)笔记本电脑散热风扇参考设计
  • 【运维心得】三步更换HP笔记本电脑外壳
  • 玄机靶场 | 日志分析-Tomcat日志分析
  • Tomcat架构深度解析:从Server到Servlet的全流程揭秘
  • Jenkins常见问题及解决方法
  • js原生实现手写签名与使用signature_pad库实现手写签名
  • 【科研绘图系列】R语言在DOM再矿化数据分析与可视化中的应用
  • 【CF】Day128——杂题 (图论 + 贪心 | 集合 + 贪心 + 图论 | 二分答案 + 贪心)
  • bev 感知算法 近一年来的新进展
  • echarts 画一个饼图,并且外围有一个旋转动画
  • pytest tmpdir fixture介绍(tmpdir_factory)(自动在测试开始前创建一个临时目录,并在测试结束后删除该目录)
  • 【LeetCode题解】LeetCode 35. 搜索插入位置
  • flowable汇总查询方式
  • ktg-mes 改造成 Saas 系统
  • Golang分布式事务处理方案
  • ROS move_base 混合功能导航 RealSense D435i + 3D 点云地图 + 楼层切换 + 路径录制 + 路径规划
  • 适合2D而非3D的游戏
  • Rust学习笔记(四)|结构体与枚举(面向对象、模式匹配)
  • 从舒适度提升到能耗降低再到安全保障,楼宇自控作用关键
  • 奈飞工厂 —— 算法优化实战推荐
  • JavaScript手录17-原型
  • 2025年生成式引擎优化(GEO)服务商技术能力评估报告
  • 【Docker】Ubuntu上安装Docker(网络版)
  • [创业之路-550]:公司半年度经营分析会 - 常见差距与根因分析示例
  • linux网络基础