Qt扫盲-QDateTime理论总结

news/2025/1/12 6:01:28/

QDateTime理论使用总结

  • 一、概述
  • 二、使用
    • 1. 构造初始化对象
    • 2. 获取属性
    • 3. 字符串和QDateTime互转
    • 4. 时间比较
    • 3. 注意
  • 三、使用时区
  • 四、夏令时(DST)

一、概述

QDateTime对象编码日历日期和时钟时间(“datetime”)。它结合了QDate和QTime类的特性。它可以从系统时钟读取当前的datetime。它提供了比较datetime的函数,以及通过添加秒、日、月或年来操作datetime的函数。
QDateTime可以与QTimeZone类一起描述日期时间相对于本地时间、UTC、与UTC的指定偏移量或与指定时区的关系。例如,“欧洲/柏林”时区将适用德国自1970年以来使用的日光节约规则。相比之下,与UTC的+3600秒的偏差比UTC早了一小时(通常在ISO标准表示法中写成“UTC+01:00”),没有夏令时偏差或变化。在使用本地时间或指定时区时,时区转换如夏令时(DST;但请参见下文)。用于表示datetime的系统被称为“timespec”。

二、使用

1. 构造初始化对象

创建QDateTime对象通常需要在构造函数中显式地给出日期和时间,或者使用静态函数,如currentDateTime()或fromMSecsSinceEpoch()。日期和时间可以通过setDate()和setTime()修改。也可以使用setMSecsSinceEpoch()函数设置datetime,它从1970年1月1日00:00:00开始计算的时间,单位为毫秒。fromString()函数返回一个QDateTime对象,给定一个字符串和用于解释字符串中日期的日期格式。

QDateTime::currentDateTime()返回一个QDateTime,表示相对于本地时间的当前时间。QDateTime::currentDateTimeUtc()返回一个QDateTime,表示相对于UTC的当前时间。

2. 获取属性

函数date()和time()提供了对datetime的日期和时间部分的访问。,我们再对 date()和time() 进行获取这个 QDate、QTime对象,再对这些对象获取信息即可。具体怎么获取的话,可以看我专栏里面对这两个对象的描述。

3. 字符串和QDateTime互转

日期通用转换表

字符模式含义
d以数字开头的日期(1到31)
dd以0开头的数字表示的日期(01到31)
ddd缩写的本地化日名称(例如。‘Mon’到‘Sun’)。使用系统区域设置本地化名称,即QLocale::system()。
dddd长本地化的日期名称(例如:“周一”到“周日”)。使用系统区域设置本地化名称,即QLocale::system()。
M以数字开头的月份(1到12)
MM以0开头的数字表示的月份(01到12)
MMM缩写的本地化月份名称(例如。‘Jan’到‘Dec’)。使用系统区域设置本地化名称,即QLocale::system()。
MMMM长本地化月份名称(例如:“一月”到“十二月”)。使用系统区域设置本地化名称,即QLocale::system()。
yy以两位数表示的年份(00到99)
yyyy四位数的年份。如果年份是负数,则在前面加上一个减号,总共5个字符。

时间通用转换表

符号含义
h没有前导零的小时数(0到23或1到12如果AM/PM显示)
hh以零开头的小时数(如果显示AM/PM,则为00到23或01到12)
H不以0开头的小时数(0到23,即使有AM/PM显示)
HH以0开头的小时数(00到23,即使有AM/PM显示)
m没有0开头的分钟(0到59)
mm以0开头的分钟(00到59)
s整个秒,没有任何前导0(0到59)
ss整秒,在适用的情况下以0开头(00到59)
z小数秒的小数部分,在小数点之后,后面没有零(0到999)因此,“s.z”报告了完全可用(毫秒)精度的秒数,并且没有末尾的零。
zzz秒的小数部分,精确到毫秒,在适当的情况下包括后面的零(000到999)。
AP或A使用AM/PM显示。A/AP将被替换为大写版本的QLocale::amText()或QLocale::pmText()。
ap或a使用am/pm显示。a/ap将被小写版本的QLocale::amText()或QLocale::pmText()替换。
t时区(例如“CEST”)
  1. QDateTime转字符串
  • QString QDateTime::toString(const QString &format)

用单引号括起来的任何字符序列都会原封不动地包含在输出字符串中(去掉引号),即使其中包含格式化字符。在输出中,两个连续的单引号(" " ")被替换为单引号。格式字符串中的所有其他字符都将逐字包含在输出字符串中。
没有分隔符的格式(例如:“ddMM”)是支持的,但必须谨慎使用,因为结果字符串并不总是可靠可读的(例如,如果“dM”产生“212”,它可能意味着12月2日或2月21日)。

假设一个日期是 2001年 5月 21号 14:13:09.120

不同格式字符串也就是 上面函数的 format 不同,对应转换的字符串也不一样,左边是格式,右边是结果

dd.MM.yyyy ----> 21.05.2001
ddd MMMM d yy ----> Tue May 21 01
hh:mm:ss.zzz ----> 14:13:09.120
hh:mm:ss.z ----> 14:13:09.12
h: m : s ap ----> 2: 13 :9 pm

  1. 字符串转QDateTime
  • QDateTime QDateTime::fromString(const QString &string, const QString &format, QCalendar cal)
  QTime time1 = QTime::fromString("131", "HHh");// time1 is 13:00:00QTime time1 = QTime::fromString("1apA", "1amAM");// time1 is 01:00:00QDateTime dateTime2 = QDateTime::fromString("M1d1y9800:01:02","'M'M'd'd'y'yyhh:mm:ss");// dateTime is 1 January 1998 00:01:02QDateTime dateTime = QDateTime::fromString("130", "Mm"); // invalidQString string = "Tuesday, 23 April 12 22:51:41";QString format = "dddd, d MMMM yy hh:mm:ss";QDateTime valid = QDateTime::fromString(string, format);

在转换的过程中,如果有些值没指出,就会用默认值

Year :1900
Month :1 (January)
Day :1
Hour :0
Minute : 0
Second :0

  QDateTime dateTime = QDateTime::fromString("1.30.1", "M.d.s");// dateTime is January 30 in 1900 at 00:00:01.dateTime = QDateTime::fromString("12", "yy");// dateTime is January 1 in 1912 at 00:00:00.

4. 时间比较

QDateTime提供了一套完整的操作符来比较两个QDateTime对象,其中较小意味着较早,较大意味着较晚。

你可以使用addMSecs()将datetime增加(或减少)指定毫秒数,使用addSecs()增加(或减少)指定秒数,或使用addDays()增加(或减少)指定天。类似地,你可以使用addMonths()和addYears()。daysTo()函数返回两个datetimes之间的天数,secsTo()返回两个datetimes之间的秒数,而msecsTo()返回两个datetimes之间的毫秒数。在适用的情况下,这些操作可以感知日光节约时间(DST)和其他时区转换。

使用toTimeSpec()以本地时间或UTC表示datetime,使用toffsetfromutc()表示与UTC的偏移量,或使用toTimeZone()表示相对于一般时区的偏移量。你可以使用timeSpec()找出一个QDateTime对象相对于什么时间规格存储其时间。如果是Qt::TimeZone,可以使用TimeZone()找出它使用的是哪个时区。

注意:QDateTime不考虑闰秒。

3. 注意

  1. 没有年份0。该年的日期被认为是无效的。-1年是“前1年”或“前1年”。公元前1月1日的前一天是公元前12月31日。
    有效日期范围
  2. QDateTime可以表示的值的范围取决于内部的存储实现。QDateTime当前存储在qint64中,是一个编码日期和时间的串行msecs值。这将日期范围限制在+/- 2.92亿年,而QDate的范围为+/- 20亿年。在创建具有极端值的QDateTime时,必须注意不要使存储空间溢出。支持的值的准确范围取决于Qt::TimeSpec和时区。

三、使用时区

QDateTime使用系统的时区信息 来确定当前的本地时区及其与UTC的偏差。如果系统没有正确配置或不是最新的,QDateTime将给出错误的结果。
QDateTime同样使用系统提供的信息来确定其他时区与UTC的偏移量。如果此信息不完整或过时,QDateTime将给出错误的结果。有关更多详细信息,请参阅QTimeZone文档。

在现代Unix系统上,这意味着QDateTime通常尽可能具有关于历史变迁(包括DST,见下文)的准确信息。在Windows上,系统不支持历史时区数据,时区转换的历史准确性不保持,特别是DST。

四、夏令时(DST)

QDateTime考虑了标准时间和夏令时之间的转换。例如,如果转换发生在凌晨2点,时钟向前移动到3点,那么从02:00:00到02:59:59.999之间有一个“缺失”的小时,QDateTime认为这个小时是无效的。执行的任何日期运算都将考虑缺失的小时数并返回有效的结果。例如,将01:59:59加1分钟将得到03:00:00。
有效日期的范围taki


http://www.ppmy.cn/news/20699.html

相关文章

Matlab pdetool

云溪岩绵迎彩霞,博主精神压力大呀,没人说说知心话啊,SCU物理要命啦........基本物理方程静电磁场交流电磁场热传导Options->ApplicationGeneric Scalar泛型标量Generic System通用系统Structural Mechanics,Plane Stress结构力学 - 平面应力Structural Mechanics,Plane Stra…

参数检验与非参数检验

综述 假设检验 参数检验 T检验 T检验是通过比较不同数据的均值,研究两组数据之间是否存在显著差异。 单总体检验:单总体t检验是检验一个样本平均数与一个已知的总体平均数的差异是否显著。当总体分布是正态分布,如总体标准差未知且样本容量小…

Docker安装使用系列七之内部程序可视化

基于Docker进行项目开发时,当需要在docker容器里运行一些qt图形界面的软件以及ros等,或者要调用摄像头,输出图像等等一些需求,这个时候需要解决这个Docker “可视化”的问题,注意这里不是网上一搜一大把的那种可视化容…

如何实现报表集成?(一)

报表需求在每个企业都是“刚需”,而报表的应用又是其中的关键之一,并不是说报表开发出来就万事大吉了,怎么用、怎么用得好,也是用户非常关注的。在这个话题中,报表的集成是个绕不过去的坎,如何通过集成&…

Vue路由和路由器简介

前言 路由(route)是vue中非常重要的技术,几乎每一个用vue所写的项目都会用到路由,它是一个vue的插件库,专门实现SPA应用 路由(route)的简介 说到路由,大多数人会想到路由器(router),可以这么说,路由器上的每一个口都…

【C++】特殊类设计

​🌠 作者:阿亮joy. 🎆专栏:《吃透西嘎嘎》 🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根 目录👉设计一个…

Redis 面试题总结

Redis是什么? Redis 是一个 key-value 存储系统,它支持存储的 value 类型相对更多,包括 string、list、set、zset(sorted set --有序集合)和 hash。这些数据结构都支持 push/pop、add/remove 及取交集并集和差集及更丰…

面试_Selenium常见问题

1.selenium 工作原理 1.对于每一条Selenium脚本,一个http请求会被创建并且发送给浏览器的驱动 2.浏览器驱动中包含了一个HTTP Server,用来接收这些http请求 3.HTTP Server接收到请求后根据请求来具体操控对应的浏览器 4.浏览器执行具体的测试步骤 5.浏览…