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”) |
- 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
- 字符串转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. 注意
- 没有年份0。该年的日期被认为是无效的。-1年是“前1年”或“前1年”。公元前1月1日的前一天是公元前12月31日。
有效日期范围 - 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