一、前言
时间类QDateTime、QDate、QTime、QTimeZone保存了Qt的时间、日期、时区信息,常用的时间类部件都会用到这些数据结构,常用概念有年、月、日、时、分、秒、毫秒和时区,时间和时区就关系到时间戳和UTC的概念。
UTC时间,又称世界统一时间、世界标准时间、国际协调时间。中国大陆、中国香港、中国澳门、中国台湾与UTC时差均为+8,也就是UTC+8,Windows在设置时间界面-调整时区的下拉框中可以找到这些。
Unix 时间戳是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。
DST夏令时,又称“日光节约时制”和“夏令时间”,是一种为节约能源而人为规定地方时间的制度,在这一制度实行期间所采用的统一时间称为“夏令时间”,一般在天亮早的夏季人为将时间调快一小时,各个地方制度不一样。
一、QDateTime类
QDateTime类是QDate和QTime的组合,用来显示时间和日期。可以与QTimeZone类一起描述与本地时间、UTC时间、UTC的指定偏移量或指定时区相关的日期时间。
QDateTime时间戳是qint64类型,所以这将日期范围限制在+/- 2.92亿年左右。在创建具有极端值的QDateTime时,必须小心,以免溢出存储空间。支持的值的确切范围取决于时间戳和时区。
1、构造对象
QDateTime提供了多种构造函数来实例化对象。
给定日期,时间默认为(00:00:00.000),并将timeSpec()设置为Qt::LocalTime。
QDateTime(const QDate &date)
给定时间和日期加时间规范创建。如果spec是Qt::OffsetFromUTC,那么它将被设置为Qt::UTC,即0秒的偏移量。如果spec是Qt::TimeZone,那么spec将被设置为Qt::LocalTime,即当前系统时区。
QDateTime(const QDate &date, const QTime &time, Qt::TimeSpec spec = Qt::LocalTime)
给定时间和日期加时区偏移量创建。如果规格是Qt::OffsetFromUTC和offsetSeconds为0,那么timeSpec将被设置为Qt::UTC,即0秒的偏移量。
QDateTime(const QDate &date, const QTime &time, Qt::TimeSpec spec, int offsetSeconds)
给定时间和日期加加timeZone指定的时区创建,timeSpec将被设置为Qt::TimeZone。
QDateTime(const QDate &date, const QTime &time, const QTimeZone &timeZone)
根据其他现有对象创建。
QDateTime::QDateTime(const QDateTime &other)
还可以通过静态函数传入时间戳(自1970-01-01T00:00:00.000以来经过的毫秒数/秒数)或者字符串来构造。
QDateTime fromMSecsSinceEpoch(qint64 msecs)
QDateTime fromMSecsSinceEpoch(qint64 msecs, Qt::TimeSpec spec, int offsetSeconds = 0)
QDateTime fromMSecsSinceEpoch(qint64 msecs, const QTimeZone &timeZone)
QDateTime fromSecsSinceEpoch(qint64 secs, Qt::TimeSpec spec = Qt::LocalTime, int offsetSeconds = 0)
QDateTime fromSecsSinceEpoch(qint64 secs, const QTimeZone &timeZone)
QDateTime fromString(const QString &string, Qt::DateFormat format = Qt::TextDate)
QDateTime fromString(const QString &string, const QString &format, QCalendar cal)
示例:
QString string = "Tuesday, 23 April 12 22:51:41";
QString format = "dddd, d MMMM yy hh:mm:ss";
QDateTime valid = QDateTime::fromString(string, format);
2、时间加减
QDateTime允许时间直接进行加减,得到一个早晚的时间,方法结果都返回一个新的对象,参数如果是正数则晚几年/月/天/秒/毫秒,负数则早几年/月/天/秒/毫秒。
如果timeSpec为Qt::LocalTime,加减刚好落在标准时间和夏令时的过渡上,那么会进行调整。比如过渡是在凌晨2点,时钟向前到凌晨3点,结果落在凌晨2点和凌晨3点之间,那么结果将被调整到凌晨3点之后。
QDateTime addYears(int nyears) const //加减年数
QDateTime addMonths(int nmonths) const //加减月数
QDateTime addDays(qint64 ndays) const //加减天数
QDateTime addSecs(qint64 s) const //加减秒数
QDateTime addMSecs(qint64 msecs) const //加减毫秒
3、时间参数
通过QDateTime的公共方法获取日期、时间、时间规范、时区。使用setTimeZone()则timeSpec()被设置成Qt::TimeZone。使用setOffsetFromUtc(),如果offset为0,timeSpec()返回Qt::UTC否则为Qt::OffsetFromUTC。
QDate date() const //获取日期
void setDate(const QDate &date) //设置时间
QTime time() const //获取时间
void setTime(const QTime &time) //设置时间
QTimeZone timeZone() const //获取时区
void setTimeZone(const QTimeZone &toZone) //设置时区
int offsetFromUtc() const //获取UTC偏移量,
void setOffsetFromUtc(int offsetSeconds) //设置UTC偏移量,
Qt::TimeSpec timeSpec() const //获取时间规范
void setTimeSpec(Qt::TimeSpec spec) //设置时间规范
Qt::TimeSpec参数 描述 Qt::LocalTime 当地时间 Qt::UTC UTC时间 Qt::OffsetFromUTC UTC+偏移量 Qt::TimeZone 指定时区
3、计算时间间隔
这些方法计算这个日期时间到另一个日期时间的天/秒/毫秒数。如果后面时间早于前面,返回负数。天数是以从这个日期时间到另一个日期时间之间到达午夜的次数来计算的。这意味着从23:55到第二天0:05之间的10分钟差算作一天。
qint64 daysTo(const QDateTime &other) const //计算时间差
qint64 secsTo(const QDateTime &other) const
qint64 msecsTo(const QDateTime &other) const
实例:结果为1、1、-1。
QDateTime startDate(QDate(2012, 7, 6), QTime(8, 30, 0));
QDateTime endDate(QDate(2012, 7, 7), QTime(16, 30, 0));
qDebug() << "Days from startDate to endDate: " << startDate.daysTo(endDate);
startDate = QDateTime(QDate(2012, 7, 6), QTime(23, 55, 0));
endDate = QDateTime(QDate(2012, 7, 7), QTime(0, 5, 0));
qDebug() << "Days from startDate to endDate: " << startDate.daysTo(endDate);
qSwap(startDate, endDate);
qDebug() << "Days from startDate to endDate: " << startDate.daysTo(endDate);
4、字符串输出
toString方法以字符串形式返回日期时间。format参数决定结果字符串的格式。
QString toString(const QString &format) const
QString toString(Qt::DateFormat format = Qt::TextDate) const
QString toString(const QString &format, QCalendar cal) const
QString toString(QStringView format) const
QString toString(QStringView format, QCalendar cal) const
格式如下,区分大小写。
参数 描述 d 日数 十位不补零(1-31) dd 日数 十位补零(01-31) ddd 星期缩写名(例如:“Mon”到“Sun”),使用系统语言环境对名称进行本地化。 dddd 星期完整名(例如:“Monday”到“Sunday”),使用系统语言环境对名称进行本地化。 M 月份 十位不补零(1-12) MM 月份 十位补零(01-12) MMM 月份缩写名(例如:“Jan”到“Dec”),使用系统语言环境对名称进行本地化。 MMMM 月份完整名(例如:“January”到“December”),使用系统语言环境对名称进行本地化。 yy 两位年份(00-99) yyyy 四位年份(2023) h 小时 十位不补零(根据AM和PM显示0-23或者1-12) hh 小时 十位补零(根据AM和PM显示00-23或者01-12) H 小时 十位不补零(0-23) HH 小时 十位补零(00-23) m 分钟 十位不补零(0-59) mm 分钟 十位补零(00-59) s 秒 十位不补零(0-59) ss 秒 十位补零(00-59) z 毫秒(0-999) zzz 毫秒(000-999) AP 或者 A AM/PM ap 或者 a am/pm t 时区
例如:
dd.MM.yyyy 21.05.2001
ddd MMMM d yy Tue May 21 01
hh:mm:ss.zzz 4:13:09.120
hh:mm:ss.z 14:13:09.12
h:m:s ap 2:13:9 pm
二、QDate类
此类表示一个特定的日期,而不考虑日历、语言环境或创建时使用的其他设置或系统提供的设置。提供year()、month()和day()函数提供对年、月和日数字的访问。提供dayOfWeek()和dayOfYear()显示日期在一周中和一年中的第几天。daysInMonth()和daysInYear()函数分别返回该日期的月份和年份中有多少天。addDays()加减时间、daysTo()比较时间,toString()函数以文本格式提供相同的信息、静态函数传入字符串构造类等这些和QDateTime用法类似。
三、QTime类
此类包含一个时钟时间,它可以表示为从午夜开始的小时、分钟、秒和毫秒数。它提供了比较时间和通过添加毫秒数来操纵时间的函数。QTime使用24小时时钟格式,它没有AM/PM的概念。提供hour()、minute()、second()和msec()函数对时间的小时、分钟、秒和毫秒数的访问。addSecs()加减时间,secsTo()比较时间,toString()函数以文本格式提供相同的信息、静态函数传入字符串构造类类等这些和QDateTime用法类似。