Qt时间日期处理与定时器使用总结
一、日期时间数据
1.QTime
用于存储和操作时间数据的类,其中包括小时(h)、分钟(m)、秒(s)、毫秒(ms)。函数定义如下:
//注:秒(s)和毫秒(ms)有默认值0
QTime::QTime(int h, int m, int s = 0, int ms = 0)
若无须初始化时间数据,可以使用静态函数 QTime::currentTime() 来创建一个QTime对象,并获取当前时间:
QTime time = QTime::currentTime();
在通常情况下,我们直接获取当前时间即可,如需修改当前时间可直接使用setHMS方法。因此后文将不再介绍使用函数定义的方法操作时间数据。
在默认情况下,QTime总是使用24小时制,不区分AM/PM。那么我们想要用到12小时制时该怎么处理时间数据呢?这里需要用到一个函数 toString() 来格式化时间(后文有介绍)。
int hour() | 返回当前小时数据 |
int minute() | 返回当前分钟数据 |
int second() | 返回当前秒数据 |
int msec() | 返回当前毫秒数据 |
bool setHMS(int h, int m, int s, int ms = 0) | 设置时间 |
int msecsSinceStartOfDay() | 返回从00:00:00开始的毫秒数 |
QTime addSecs(int s) | 返回当前±s秒后的时间 |
int secsTo(QTime t) | 返回当前时间与t相差的秒数 |
2.QDate
用于存储和操作日期数据的类,其中包含年、月、日数据。同样也可使用 QDate::currentDate() 来获取当前日期。
当然说到日期,其中一个避不开的话题就是判断闰年。这里Qt直接给了一个静态函数方便判断哪一年是否为闰年:
bool QDate::isLeapYear(int year)
int year() | 返回当前日期的年数据 |
int month() | 返回当前日期的月数据 |
int day() | 返回当前日期的日数据 |
int dayOfWeek() | 返回星期几 |
bool setDate(int year, int month, int day) | 设置日期 |
bool getDate(int *year, int *month, int *day) | 获取日期 |
QDate addDays(int ndays) | 返回当前日期再加几天的日期 |
qint64 daysTo(QDate d) | 返回与日期d的间隔天数 |
3.QDateTime
表示日期数据和时间数据的类。可通过如下方式获取日期和时间:
QDateTime dateTime = QDateTime::currentDateTime();
QDate dateTime = DT1.date(); //获取日期
QTime dateTime = DT1.time(); //获取时间
qint64 toSecsSinceEpoch() | 返回与1970年1月1日相差的秒数 |
void setSecsSinceEpoch(qint64 secs) | 设置与1970年1月1日相差的秒数为当前的日期数据 |
QdateTime toUTC() | 将当前时间转换为UTC数据 |
注:UTC(协调世界时,Coordinated Universal Time)是世界上时间的标准,它不受时区影响,并且基于原子钟的精确计时。UTC时间是一种时间标准,用于全球的时钟和时间信号。
4.格式化日期时间数据
QTime、QDate、QDateTime都有格式化数据方法 toString() 和 fromString()。
a.toString()
将当前的日期时间数据转换为字符串。函数原型定义如下:
QString QDateTime::toString(const QString &format)
format为转化后的格式,Qt提供了一些预定义的格式可以直接使用。常用的为:Qt::TextDate、Qt::ISODate、Qt::SystemLocaleShortDate(Qt6已被移除)等。当然也可以使用一些自定义格式,例如:
- yyyy:四位数的年份
- MM:两位数的月份(01-12)
- dd:两位数的日期(01-31)
- hh:两位数的小时(00-23)
- mm:两位数的分钟(00-59)
- ss:两位数的秒(00-59)
- zzz:三位数的毫秒(000-999)
- AP或A:使用AM/PM表示,即从24小时制转化为12小时制
注:在上面的格式中,如果只写一位,如‘d’,则表示不补零显示(1-31)而非(01-31)。 举例:
QDateTime dateTime = QDateTime::currentDateTime();
qDebug() << "TextDate format:" << dateTime.toString(Qt::TextDate);
qDebug() << "ISODate format:" << dateTime.toString(Qt::ISODate);
qDebug() << "Custom format:" << dateTime.toString("yyyy-MM-dd hh:mm:ss.zzz AP");
其输出结果为:
b.fromString()
将字符串转化为相应类的对象。其函数原型如下:
QDateTime QDateTime::fromString(const QString &string, const QString &format)
举个例子:
QString dateTimeString = "2024-07-02 14:30:45.123";
QDateTime dateTime1 = QDateTime::fromString(dateTimeString, Qt::ISODate);
QDateTime dateTime2 = QDateTime::fromString(dateTimeString, "yyyy-MM-dd hh:mm:ss.zzz");
qDebug() << "DateTime1:" << dateTime1.toString();
qDebug() << "DateTime2:" << dateTime2.toString();
输出结果为:
5.界面组件
具体在创建界面时,可拖动如图所示组件实现:
二、定时器
1.QTimer
QTimer的父类为QObject,支持Qt的元对象系统。因此虽然它不是一个界面组件类,但是它也有属性、信号(timeout())和槽(start()、stop()、自定义等)。其主要属性如下:
属性 | 类型 | 功能 |
---|---|---|
interval | int | 定时周期,单位ms |
singleShot | bool | true表示单次定时 |
timerType | Qt::TimerType | 精度类型。分为精确、粗糙、非常粗糙 |
active | bool | ture表示定时器正在运行 |
a.timeout()信号
当定时器通过 start() 启动后,每当定时溢出一次(定时周期到了),QTimer就会发射一个 timeout() 信号。如果是连续定时,QTimer就会发射多次 timeout() 信号。举个例子:
Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);QTimer *m_timer = new QTimer(this); //创建定时器,需要动态分配内存m_timer->stop(); //先停止定时器m_timer->setTimerType(Qt::CoarseTimer); //设置定时器精度等级:粗糙,误差不超过整个周期的5%m_timer->setInterval(3000); //设置定时器的周期为3sm_timer->setSingleShot(true); //设置单次定时connect(m_timer,SIGNAL(timeout()),this,SLOT(do_timer_timeout())); //关联定时器的信号与槽
}//与定时器的timeout()信号关联的槽函数
void Widget::do_timer_timeout()
{QApplication::beep(); //定时溢出时,系统的蜂鸣器发声
}//“开始”按钮来启动定时器
void Widget::on_btnStart_clicked()
{m_timer->start(); //启动定时器,m_timer为QTimer类
}
那么当点击开始按钮后,在3s后就会听到系统的蜂鸣声。
b.静态函数singleShot()
这个函数用来创建和启动单次定时器,并且将定时器的timeout()信号与指定槽函数关联。也就是说,如果只是定时一次,那么就无须繁琐的设置,也无须启动,随调随用。函数定义如下:
void QTimer::singleShot(int msec, Qt::TimerType timerType, const QObject *reveiver, const char *member)
那么上面的例子就可以这样改写:
Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);
}//与定时器的timeout()信号关联的槽函数
void Widget::do_timer_timeout()
{QApplication::beep(); //定时溢出时,系统的蜂鸣器发声
}//动态创建单次定时器
void Widget::on_btnOneShot_clicked()
{QTimer::singleShot(3000,Qt::CoarseTimer,this,&Widget::do_timer_timeout);
}
2.QElapsedTimer
这个类用于快速计算两个事件的间隔时间。与QTimer不同的是,它没有父类,不支持Qt的元对象系统,所以只有一些简单的接口函数。使用起来也比较简单,举个例子即可快速了解:
Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{QElapsedTimer m_counter; // 创建计时器m_counter.start(); //启动计时器,注意这里没有stop()方法
}//停止计时
void Widget::on_btnStop_clicked()
{int tmMsec=m_counter.elapsed(); //毫秒数int ms= tmMsec % 1000; //余数毫秒int sec=tmMsec/1000; //整秒QString str=QString("流逝的时间:%1秒,%2毫秒").arg(sec).arg(ms,3,10,QChar('0'));qDebug() << "Elapsed time:" << str;
}
点击停止按钮后可看到输出框的结果为:
以上就是关于Qt中关于时间日期数据的一些总结。虽查阅大量资料,可能仍有部分错误,望读者不吝赐教。
相关文章:

Qt时间日期处理与定时器使用总结
一、日期时间数据 1.QTime 用于存储和操作时间数据的类,其中包括小时(h)、分钟(m)、秒(s)、毫秒(ms)。函数定义如下: //注:秒(s)和毫秒(ms)有默认值0 QTime::QTime(int h, int m, int s 0, int ms 0) 若无须初始化时间数据,可…...

数据结构——Hash Map
1. Hash Map简介 Hash Map是一种基于键值对的数据结构,通过散列函数将键映射到存储位置,实现快速的数据查找和存储。它可以在常数时间内完成查找、插入和删除操作,因此在需要频繁进行这些操作时非常高效。 2. Hash Map的定义 散列表ÿ…...

剪画小程序:视频剪辑-视频播放倍数的调整与应用
在这个快节奏的时代,时间变得越来越宝贵,而视频倍数播放功能就像是我们的时间管理小助手,为我们的视频观看带来了极大的便利。你是否好奇它到底能在哪些地方发挥作用呢?让我们一起来看看! 只要使用小程序【剪画】的里…...

使用 Java Swing 和 XChart 创建多种图表
在现代应用程序开发中,数据可视化是一个关键部分。本文将介绍如何使用 Java Swing 和 XChart 库创建各种类型的图表。XChart 是一个轻量级的图表库,支持多种类型的图表,非常适合在 Java 应用中进行快速的图表绘制。 1、环境配置 在开始之前&…...

信息系统运维管理:实践与发展
信息系统运维管理:实践与发展 信息系统运维管理在现代企业中扮演着至关重要的角色,确保信息系统的高效、安全和稳定运行。本文结合《信息系统运维管理》文档内容,探讨了服务设计阶段、服务转换阶段、委托系统维护管理三个主要章节࿰…...

html+js+css登录注册界面
拥有向服务器发送登录或注册数据并接收返回数据的功能 点赞关注 界面 源代码 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <title>Login and Registration Form</title> <style> * …...

英伟达(NVIDIA)数据中心GPU介绍
英伟达(NVIDIA)数据中心GPU按性能由高到低排行: 1. NVIDIA H100 架构:Hopper 核心数量:18352 CUDA Cores, 1456 Tensor Cores 显存:80 GB HBM3 峰值性能: 单精度(FP32)…...

Leetcode 3202. Find the Maximum Length of Valid Subsequence II
Leetcode 3202. Find the Maximum Length of Valid Subsequence II 1. 解题思路2. 代码实现 题目链接:3202. Find the Maximum Length of Valid Subsequence II 1. 解题思路 这一题的话是上一题3201. Find the Maximum Length of Valid Subsequence I的升级版&am…...

通过Spring Boot结合实时流媒体技术对考试过程进行实时监控
本章将深入探讨考试系统中常见的复杂技术问题,并提供基于Spring Boot 3.x的解决方案。涵盖屏幕切换检测与防护、接打电话识别处理、行为监控摄像头使用、网络不稳定应对等,每篇文章详细剖析问题并提供实际案例与代码示例,帮助开发者应对挑战&…...

智能扫地机器人避障与防跌落问题解决方案
智能扫地机器人出现避障与防跌落问题时,可以通过以下几种方式来解决: 一、避障问题的解决方案 1.升级避障技术: ① 激光雷达避障:激光雷达通过发射和接收激光信号来判断与障碍物的距离,具有延迟低、效果稳定、准确度…...

德旺训练营称重问题
这是考小学的分治策略,小学的分治策略几乎都是分三组。本着这个策略,我们做看看。 第一次称重: 分三组,16,16,17,拿两个16称,得到A情况,一样重,那么假铜钱在那组17个里面。B情况不…...

数据决策系统详解
文章目录 数据决策系统的核心组成部分:1. **数据收集与整合**:2. **数据处理与分析**:3. **数据可视化**:4. **决策支持**: 数据决策系统的功能:决策类型:数据决策系统对企业的重要性࿱…...

JSON 简述与应用
1. JSON 简述 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,常用于客户端与服务器之间的数据传递。它基于JavaScript对象表示法,但独立于语言,可以被多种编程语言解析和生成。 1.1 特点 轻量级&#…...

ResNet50V2
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 一、ResNetV1和ResNetV2的区别 ResNetV2 和 ResNetV1 都是深度残差网络(ResNet)的变体,它们的主要区别在于残差块的设计和…...

基于深度学习的虚拟换装
基于深度学习的虚拟换装技术旨在通过计算机视觉和图像处理技术,将不同的服装虚拟地穿在用户身上,实现快速的试穿和展示。这项技术在电商、时尚和虚拟现实领域具有广泛的应用,能够提升用户体验,增加互动性。以下是关于这一领域的系…...

单段时间最优S型速度规划算法
一,背景 在做机械臂轨迹规划的单段路径的速度规划时,除了参考《Trajectory Planning for Automatic Machines and Robots》等文献之外,还在知乎找到了这位大佬 韩冰 写的在线规划方法: https://zhuanlan.zhihu.com/p/585253101/e…...

pom文件-微服务项目结构
一、微服务项目结构 my-microservices-project/ ├── pom.xml <!-- 父模块的pom.xml --> ├── ry-system/ │ ├── pom.xml <!-- 子模块ry-system的pom.xml --> │ └── src/main/java/com/example/rysystem/ │ └── RySystemApplication.…...

解析Kotlin中的Nothing【笔记摘要】
1.Nothing的本质 Nothing 的源码很简单: public class Nothing private constructor()可以看到它是个class,但它的构造函数是 private 的,这就导致我们没法创建它的实例,并且在源码里 Kotlin 也没有帮我们创建它的实例。 基于这…...

toRefs 和 toRef
文章目录 toRefs 和 toReftoRefstoRef toRefs 和 toRef toRefs toRefs 把一个由reactive对象的值变为一个一个ref的响应式的值 import { ref, reactive, toRefs, toRef } from vue; let person reactive({name: 张三,age: 18, }); // toRefs 把一个由reactive对象的值变为一…...

Vision Transformer论文阅读笔记
目录 An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale -- Vision Transformer摘要Introduction—简介RELATED WORK—相关工作METHOD—方法VISION TRANSFORMER (VIT)—视觉Transformer(ViT) 分析与评估PRE-TRAINING DATA REQUIREMENTS—预训练数据…...

MapReduce的执行流程排序
MapReduce 是一种用于处理大规模数据集的分布式计算模型。它将作业分成多个阶段,以并行处理和分布式存储的方式来提高计算效率。以下是 MapReduce 的执行流程以及各个阶段的详细解释: 1. 作业提交(Job Submission) 用户通过客户端…...

雅思词汇及发音积累 2024.7.3
银行 check (美)支票 cheque /tʃek/ (英)支票 ATM 自动取款机 cashier 收银员 teller /ˈtelə(r)/ (银行)出纳员 loan 贷款 draw/withdraw money 提款 pin number/passsword/code …...

Vue2和Vue3的区别Vue3的组合式API
一、Vue2和Vue3的区别 1、创建方式的不同: (1)、vue2:是一个构造函数,通过该构造函数创建一个Vue实例 new Vue({})(2)、Vue3:是一个对象。并通过该对象的createApp()方法,创建一个vue实例。 Vue…...

ML307R OpenCPU HTTP使用
一、函数介绍 二、示例代码 三、代码下载地址 一、函数介绍 具体函数可以参考cm_http.h文件,这里给出几个我用到的函数 1、创建客户端实例 /*** @brief 创建客户端实例** @param [in] url 服务器地址(服务器地址url需要填写完整,例如(服务器url仅为格式示…...

【状态估计】线性高斯系统的状态估计——离散时间的递归滤波
前两篇文章介绍了离散时间的批量估计、离散时间的递归平滑,本文着重介绍离散时间的递归滤波。 前两篇位置:【状态估计】线性高斯系统的状态估计——离散时间的批量估计、【状态估计】线性高斯系统的状态估计——离散时间的递归平滑。 离散时间的递归滤波…...

架构设计上中的master三种架构,单节点,主从节点,多节点分析
文章目录 背景单节点优点缺点 主从节点优点缺点 多节点优点缺点 多节点,多backup设计优点缺点 总结 背景 在很多分布式系统里会有master,work这种结构。 master 节点负责管理资源,分发任务。下面着重讨论下master 数量不同带来的影响 单节点 优点 1.设…...

如何在 SQL 中删除一条记录?
如何在 SQL 中删除一条记录? 在 SQL 中,您可以使用DELETE查询和WHERE子句删除表中的一条记录。在本文中,我将向您介绍如何使用DELETE查询和WHERE子句删除记录。我还将向您展示如何一次从表中删除多条记录 如何在 SQL 中使用 DELETE 这是使…...

JavaSE (Java基础):面向对象(上)
8 面向对象 面向对象编程的本质就是:以类的方法组织代码,以对象的组织(封装)数据。 8.1 方法的回顾 package com.oop.demo01;// Demo01 类 public class Demo01 {// main方法public static void main(String[] args) {int c 10…...

flink使用StatementSet降低资源浪费
背景 项目中有很多ods层(mysql 通过cannal)kafka,需要对这些ods kakfa做一些etl操作后写入下一层的kafka(dwd层)。 一开始采用的是executeSql方式来执行每个ods→dwd层操作,即类似: def main(…...

FineDataLink4.1.9支持Kettle调用
FDL更新至4.1.9后,新增kettle调用功能,支持不增加额外负担的情况下,将现有的Kettle任务平滑迁移到FineDataLink。 一、更新版本前存在的问题与痛点 在此次功能更新前,用户可能会遇到以下问题: 1.对于仅使用kettle的…...