本页内容

QDateTime Class

QDateTime 类提供了日期和时间函数。更多内容...

头文件: #include <QDateTime>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core

注意:该类中的所有函数均为可重入函数。

QDateTime 比较

类别可比较类型
weakQDateTime

公共类型

(since 6.7) enum class TransitionResolution { Reject, RelativeToBefore, RelativeToAfter, PreferBefore, PreferAfter, …, PreferDaylightSaving }
enum class YearRange { First, Last }

公共函数

QDateTime(QDate date, QTime time, const QTimeZone &timeZone, QDateTime::TransitionResolution resolve = TransitionResolution::LegacyBehavior)
QDateTime()
(since 6.5) QDateTime(QDate date, QTime time, QDateTime::TransitionResolution resolve = TransitionResolution::LegacyBehavior)
QDateTime(const QDateTime &other)
QDateTime(QDateTime &&other)
~QDateTime()
QDateTime addDays(qint64 ndays) const
(since 6.4) QDateTime addDuration(std::chrono::milliseconds msecs) const
QDateTime addMSecs(qint64 msecs) const
QDateTime addMonths(int nmonths) const
QDateTime addSecs(qint64 s) const
QDateTime addYears(int nyears) const
QDate date() const
qint64 daysTo(const QDateTime &other) const
bool isDaylightTime() const
bool isNull() const
bool isValid() const
qint64 msecsTo(const QDateTime &other) const
int offsetFromUtc() const
qint64 secsTo(const QDateTime &other) const
void setDate(QDate date, QDateTime::TransitionResolution resolve = TransitionResolution::LegacyBehavior)
void setMSecsSinceEpoch(qint64 msecs)
void setSecsSinceEpoch(qint64 secs)
void setTime(QTime time, QDateTime::TransitionResolution resolve = TransitionResolution::LegacyBehavior)
void setTimeZone(const QTimeZone &toZone, QDateTime::TransitionResolution resolve = TransitionResolution::LegacyBehavior)
void swap(QDateTime &other)
QTime time() const
(since 6.5) QTimeZone timeRepresentation() const
Qt::TimeSpec timeSpec() const
QTimeZone timeZone() const
QString timeZoneAbbreviation() const
CFDateRef toCFDate() const
QDateTime toLocalTime() const
qint64 toMSecsSinceEpoch() const
NSDate *toNSDate() const
QDateTime toOffsetFromUtc(int offsetSeconds) const
qint64 toSecsSinceEpoch() const
(since 6.4) std::chrono::sys_time<std::chrono::milliseconds> toStdSysMilliseconds() const
(since 6.4) std::chrono::sys_seconds toStdSysSeconds() const
QString toString(const QString &format, QCalendar cal) const
QString toString(QStringView format) const
QString toString(Qt::DateFormat format = Qt::TextDate) const
QString toString(const QString &format) const
QString toString(QStringView format, QCalendar cal) const
QDateTime toTimeZone(const QTimeZone &timeZone) const
QDateTime toUTC() const
(since 6.4) QDateTime &operator+=(std::chrono::milliseconds duration)
(since 6.4) QDateTime &operator-=(std::chrono::milliseconds duration)
QDateTime &operator=(const QDateTime &other)

静态公共成员

(since 6.5) QDateTime currentDateTime(const QTimeZone &zone)
QDateTime currentDateTime()
QDateTime currentDateTimeUtc()
qint64 currentMSecsSinceEpoch()
qint64 currentSecsSinceEpoch()
QDateTime fromCFDate(CFDateRef date)
QDateTime fromMSecsSinceEpoch(qint64 msecs, const QTimeZone &timeZone)
QDateTime fromMSecsSinceEpoch(qint64 msecs)
QDateTime fromNSDate(const NSDate *date)
QDateTime fromSecsSinceEpoch(qint64 secs, const QTimeZone &timeZone)
QDateTime fromSecsSinceEpoch(qint64 secs)
(since 6.4) QDateTime fromStdLocalTime(const std::chrono::local_time<std::chrono::milliseconds> &time)
(since 6.4) QDateTime fromStdTimePoint(const std::chrono::time_point<Clock, Duration> &time)
(since 6.4) QDateTime fromStdTimePoint(const std::chrono::local_time<std::chrono::milliseconds> &time)
(since 6.4) QDateTime fromStdTimePoint(std::chrono::time_point<std::chrono::system_clock, std::chrono::milliseconds> time)
(since 6.4) QDateTime fromStdZonedTime(const std::chrono::zoned_time<std::chrono::milliseconds, const std::chrono::time_zone *> &time)
QDateTime fromString(const QString &string, const QString &format, int baseYear, QCalendar cal)
(since 6.0) QDateTime fromString(QStringView string, Qt::DateFormat format = Qt::TextDate)
QDateTime fromString(const QString &string, Qt::DateFormat format = Qt::TextDate)
(since 6.0) QDateTime fromString(QStringView string, QStringView format, QCalendar cal)
(since 6.7) QDateTime fromString(QStringView string, QStringView format, int baseYear = QLocale::DefaultTwoDigitBaseYear)
(since 6.0) QDateTime fromString(const QString &string, QStringView format, QCalendar cal)
(since 6.7) QDateTime fromString(const QString &string, QStringView format, int baseYear = QLocale::DefaultTwoDigitBaseYear)
QDateTime fromString(const QString &string, const QString &format, QCalendar cal)
(since 6.7) QDateTime fromString(const QString &string, const QString &format, int baseYear = QLocale::DefaultTwoDigitBaseYear)
(since 6.7) QDateTime fromString(QStringView string, QStringView format, int baseYear, QCalendar cal)
(since 6.0) QDateTime fromString(const QString &string, QStringView format, int baseYear, QCalendar cal)
bool operator!=(const QDateTime &lhs, const QDateTime &rhs)
(since 6.4) QDateTime operator+(const QDateTime &dateTime, std::chrono::milliseconds duration)
(since 6.4) QDateTime operator+(std::chrono::milliseconds duration, const QDateTime &dateTime)
(since 6.4) std::chrono::milliseconds operator-(const QDateTime &lhs, const QDateTime &rhs)
(since 6.4) QDateTime operator-(const QDateTime &dateTime, std::chrono::milliseconds duration)
bool operator<(const QDateTime &lhs, const QDateTime &rhs)
QDataStream &operator<<(QDataStream &out, const QDateTime &dateTime)
bool operator<=(const QDateTime &lhs, const QDateTime &rhs)
bool operator==(const QDateTime &lhs, const QDateTime &rhs)
bool operator>(const QDateTime &lhs, const QDateTime &rhs)
bool operator>=(const QDateTime &lhs, const QDateTime &rhs)
QDataStream &operator>>(QDataStream &in, QDateTime &dateTime)

详细说明

QDateTime 对象根据时间表示法对日历日期和时钟时间(即“日期时间”)进行编码。 它结合了QDate 和QTime 类的特性。它可以从系统时钟读取当前的日期时间。它提供了用于比较日期时间以及通过添加一定数量的秒、天、月或年来操作日期时间的功能。

QDateTime 可以基于local time 、UTC 、指定的offset from UTC 或指定的time zone 来描述日期时间。这些时间表示法中的每一种都可以封装在QTimeZone 类的适当实例中。 例如,时区“Europe/Berlin”将应用德国所采用的夏令时规则。相比之下,相对于UTC的固定偏移量+3600秒比UTC早一小时(通常按ISO标准表示法写为“UTC+01:00”),且不存在夏令时相关的问题。 无论使用本地时间还是指定的时区,系统都会考虑时区转换(参见below )。调用 QDateTime 的timeSpec() 方法可得知当前使用的是四种时间表示法中的哪一种;其timeRepresentation() 方法则会以QTimeZone 的形式提供该时间表示法的完整描述。

通常,QDateTime 对象可通过在构造函数中显式指定日期和时间,或使用静态函数(如currentDateTime() 或fromMSecsSinceEpoch())来创建。日期和时间可通过setDate() 和setTime() 进行修改。 还可以使用setMSecsSinceEpoch()函数设置日期和时间,该函数接受自1970年UTC时间起算的毫秒数。fromString()函数根据给定的字符串和用于解析字符串中日期的日期格式,返回一个QDateTime对象。

QDateTime::currentDateTime() 返回一个 QDateTime,该对象表示基于特定时间表示形式(例如本地时间,这是其默认值)的当前日期和时间。QDateTime::currentDateTimeUtc() 返回一个 QDateTime,该对象表示基于 UTC 的当前日期和时间;它等同于QDateTime::currentDateTime(QTimeZone::UTC) 。

date() 和time() 函数可访问日期和时间对象中的日期和时间部分。toString() 函数以文本格式提供了相同的信息。

QDateTime 提供了一整套运算符,用于比较两个 QDateTime 对象,其中数值越小表示时间越早,数值越大表示时间越晚。

您可以使用addMSecs() 函数以指定毫秒数为单位增量(或减量)日期时间,使用addSecs() 函数以秒为单位,或使用addDays() 函数以天为单位。同样,您也可以使用addMonths() 和addYears() 函数。daysTo() 函数返回两个日期时间之间的天数,secsTo() 返回两个日期时间之间的秒数,msecsTo() 返回两个日期时间之间的毫秒数。这些操作会考虑夏令时 (DST) 及其他时区转换(如适用)。

使用toTimeZone() 将一个 datetime 转换为其他时间表示形式。通过传入一个表示本地时间、UTC 或相对于 UTC 的固定偏移量的轻量级QTimeZone ,可以将 datetime 转换为使用相应的时间表示形式;或者,您可以传入一个完整时区(其timeSpec() 的值为Qt::TimeZone ),以使用该时区代替。

备注

QDateTime 不考虑闰秒。

所有与字符串格式的转换均使用 C 语言环境进行。有关本地化转换,请参阅QLocale 。

公历中不存在公元0年。该年的日期将被视为无效。公元前1年即“基督前1年”或“公元前1年”。公元1年1月1日的前一天是公元前1年12月31日。

使用本地时间(默认)或指定时区,意味着需要解决与transitions 相关的任何问题。因此,对这类 QDateTime 实例的操作(尤其是其构造)可能比使用 UTC 或基于 UTC 的固定偏移量时更耗时。

有效日期范围

QDateTime 能表示的值范围取决于其内部存储实现。目前,QDateTime 以 qint64 类型存储,采用连续的毫秒值来编码日期和时间。这将日期范围限制在约 ±2.92 亿年,而QDate 的范围为 ±20 亿年。 在创建包含极端值的 QDateTime 时,必须注意避免存储溢出。支持的精确值范围因所使用的时序表示法而异。

时区的使用

QDateTime 使用系统的时区信息来确定当前本地时区及其相对于 UTC 的偏移量。如果系统配置不正确或未及时更新,QDateTime 将返回错误结果。

QDateTime 同样使用系统提供的信息来确定其他时区相对于 UTC 的偏移量。如果这些信息不完整或已过时,QDateTime 将返回错误的结果。更多详细信息请参阅QTimeZone 文档。

在现代 Unix 系统上,这意味着 QDateTime 通常能在可能的情况下获得关于历史时区转换(包括夏令时,见下文)的准确信息。 在 Windows 系统上,由于系统不支持历史时区数据,因此无法保证时区转换(尤其是夏令时)的历史准确性。不过,若使用 ICU 库构建 Qt,QTimeZone 将配备与 Unix 系统相同的时区数据库。

时区转换

QDateTime 会考虑时区转换,既包括标准时间与夏令时(DST)之间的转换,也包括时区更改其标准偏移量时产生的转换。 例如,如果转换发生在凌晨 2 点,时钟向前调整到凌晨 3 点,那么从 02:00:00 到 02:59:59.999 之间就会有一个“缺失”的小时。 这种转换被称为“春前进”,被跳过的时间段没有任何意义。 当过渡方向相反时,即所谓的“秋季调回”,一个时间间隔会重复出现:先在旧时区(通常为夏令时),然后在新时区(通常为标准时间),因此该时间间隔内的时间具有歧义。

某些时区采用“反向”夏令时,即夏季使用标准时间,冬季使用夏令时(但时间偏移量较小)。 对于此类时区,春季“拨快”仍发生在春季且跳过一小时,但这是从夏令时过渡出来的过程;而秋季“拨回”虽然仍重复秋季的一小时调整,但这是向夏令时的过渡。

从协调世界时(UTC)时间(或相对于 UTC 具有固定偏移量的时间)进行转换时,在任何时区中总能得到一个明确且有效的结果。然而,当将日期和时间组合成一个以本地时间或特定时区为基准的日期时间时,名义上的结果可能会落在过渡期内,从而导致其无效或产生歧义。 可能出现这种情况的方法会接受一个resolve 参数:如果请求的日期时间有效且无歧义,该参数将始终被忽略。有关该参数可控制的选项,请参阅TransitionResolution 。在 Qt 6.7 之前,系统会自动选择与其LegacyBehavior 等效的选项。

对于“夏令时开始”时被跳过的时段,无论使用哪种偏移量来解释请求的时间,所得结果都是另一个偏移量生效时的实际时间;因此,在resolve 中传入TransitionResolution::RelativeToBefore 实际上会得到转换后的时间,而如果未发生该转换,该时间本应具有请求的表示形式。 同样地,对于TransitionResolution::RelativeToAfter 对应的resolve ,其结果是一个发生在时区转换之前的时刻;若时区转换发生得更早,该时刻本应具有请求的表示形式。

当 QDateTime 执行算术运算时,例如 addDay() 或addSecs(),它会确保产生有效的结果。 例如,在将时间从 02:00 调快到 03:00 的夏令时开始之日,将 01:59:59 加一秒将得到 03:00:00。 如果将前一天的 02:30 加一天,则在转换当天会得到 03:30;而如果通过调用addDay(-1) 将第二天 02:30 减去一天,则在转换当天会得到 01:30。 虽然addSecs() 会返回一个偏移给定秒数的时间,但addDays() 会调整日期,并且仅在否则会导致结果无效时才调整时间。 对“春令时”调整前一天的 03:00 应用addDays(1) ,结果将直接得到调整当天的 03:00,尽管后者仅比前者晚 23 小时;但addSecs(24 * 60 * 60) 会得到调整当天的 04:00,因为那是在 24 小时之后。 典型的时区调整会使某些天的时长为 23 或 25 小时。

对于系统time_t 能表示的日期时间(在采用 32 位time_t 的系统上,范围为 1901-12-14 至 2038-01-18;若类型为 64 位,则为 QDateTime 能表示的完整范围), 将使用标准系统 API 来确定本地时间相对于 UTC 的偏移量。对于这些系统 API 无法处理的日期和时间(可能包括部分处于time_t 范围内的值),若可用则使用QTimeZone::systemTimeZone(),否则将尽力进行估算。 无论哪种情况,所使用的偏移信息都取决于系统,可能不完整,或者对于过去的时间,可能在历史数据上存在偏差。此外,对于未来日期,当地时区的偏移量和夏令时规则在该日期到来之前可能会发生变化。

整日转换

少数时区在国际日期变更线穿越其境内时,曾跳过或重复过整日。对于这些时区,daysTo() 无法识别重复或缺口,仅使用日历日期之间的差值;相比之下,msecsTo() 和secsTo() 则能准确识别真实的时间间隔。 同样,addMSecs() 和addSecs() 直接对应经过时间,而addDays()、addMonths() 和addYears() 则遵循名义上的日历,除非遇到因重叠或遗漏导致的空缺或重复,需要解决由此产生的歧义或无效情况。

注意: 日历变更期间“丢失”的日子 (例如从儒略历转换为格里高利历),不会影响 QDateTime。尽管这两种日历对日期的描述方式不同,但在变更过程中的连续日子仍由连续的QDate 实例表示,每个实例都比前一个晚一天,这既符合两种日历的描述,也符合它们的 toJulianDay() 值。 相比之下,时区跳过或重复某一天时,其改变的是时间描述,而非日期描述——尽管这种改变涉及整整24小时。

相对于UTC的偏移量

相对于协调世界时(UTC)的偏移量以格林尼治以东的秒数为单位进行测量。特定日期和时间所描述的时刻(例如某一天的中午)取决于所使用的时区表示方式。对于任何给定的日期和时间组合,相对于 UTC 偏移量越大,所描述的时刻越早;偏移量越小,所描述的时刻越晚。

虽然对UTC偏移量没有明确的大小限制,但在使用toString()和fromString()方法时会受到隐式限制——这些方法采用±hh:mm格式,实际上将范围限制在±99小时59分钟内,且仅支持整分钟。 请注意,目前没有任何时区的偏移量超出 ±14 小时的范围,且所有已知的偏移量均为 5 分钟的倍数。历史时区的范围更广,其偏移量可能包含秒;但这些秒数无法在字符串中准确表示。

另请参阅 QDate 、QTime 、QDateTimeEdit 以及QTimeZone 。

成员类型文档

[since 6.7] enum class QDateTime::TransitionResolution

此枚举用于解析属于Timezone transitions 范围内的日期时间组合。

在构建以本地时间或采用夏令时的时区指定的日期时间时,或者使用setDate()、setTime() 或setTimeZone() 修改日期时间时,给定的参数可能暗示一种在该时区内要么毫无意义、要么具有两种含义的时间表示形式。此类时间表示形式被描述为处于过渡状态。 无论哪种情况,我们都可以直接返回一个无效的日期时间对象,以表明该操作未定义。在存在歧义的情况下,我们也可以从两种可能的时间中选择其一。当该时间表示法毫无意义时,我们可以选择其前后某个合理的时间点。 例如,当从较早的时间向前推进时,我们可以选择过渡后的那个时间点,该时间点实际上是距所涉及的较早时间指定时间量之后的时间。此处指定的选项用于配置此类选择的具体方式。

常量值描述
QDateTime::TransitionResolution::Reject0将过渡中的任何时间均视为无效。要么该时间确实无效,要么存在歧义。
QDateTime::TransitionResolution::RelativeToBefore1选择时间时,仿佛是从过渡之前的时间向前推进。这会使用过渡之前生效的偏移量来解释请求的时间,并在必要时将结果转换为结果时间生效的偏移量。
QDateTime::TransitionResolution::RelativeToAfter2选择一个时间,如同从过渡后的某个时间向后推算一般。这将使用过渡后生效的偏移量来解释请求的时间,并在必要时将结果转换为目标时间点生效的偏移量。
QDateTime::TransitionResolution::PreferBefore3选择过渡前的某个时间,
QDateTime::TransitionResolution::PreferAfter4选择转换后的时间。
QDateTime::TransitionResolution::PreferStandard5选择转换时间标准时间一侧的时间。
QDateTime::TransitionResolution::PreferDaylightSaving6选择位于转换点夏令时一侧的时间。

在某些构造函数和设置函数中,额外常量LegacyBehavior 被用作 TransitionResolution 参数的默认值。这是RelativeToBefore 的别名,其实现的行为与 Qt 6.7 之前QDateTime 的行为最为接近。

对于addDays()、addMonths() 或addYears(),其行为是(且在过去大部分情况下)在添加正调整时使用RelativeToBefore ,在添加负调整时使用RelativeToAfter 。

注意:在 夏令时导致夏季与 UTC 的偏移量增加的时区(称为“正夏令时”),PreferStandard 是 RelativeToAfter 的别名,PreferDaylightSaving 则是 RelativeToBefore 的别名。 在夏令时机制导致冬季与 UTC 的偏移量减小(即“负夏令时”)的时区中,情况则相反——前提是操作系统能够报告该日期时间处于夏令时还是标准时间(大多数平台均能做到这一点)。 对于某些平台,即使对于 `Qt::TimeZone ` 日期时间也无法获取转换细节,QTimeZone 不得不假定与 UTC 偏移量较小的一方为标准时间,实际上即假定为正夏令时。

下表说明了在各种可能的情况下,当当地时间在 02:00 至 03:00 之间发生转换,且两侧分别设有标称标准时间 LST 和夏令时 LDT 时,QDateTime 构造函数如何处理 02:30 的请求。 过渡类型可能是跳过一小时或重复一小时。过渡类型以及参数resolve 的值将决定在给定日期上选择哪个实际时间。首先,考虑正夏令时的常见情况,其中:

之前02:00–03:00之后resolve选定
LST跳过LDT相对于之前03:30 LDT
LST跳过LDT相对于之后01:30 LST
LST跳过LDT优先于01:30 当地标准时间
LST跳过LDT建议时间(后)03:30 夏令时(夏令时)
LST跳过LDT首选标准时01:30 LST
LST跳过夏令时优先夏令时03:30 夏令时
LDT重复LST相对于之前的时间02:30 LDT
LDT重复LST相对于之后的时间02:30 LST
LDT重复LST优先于02:30 LDT
LDT重复LST建议之后02:30 LST
LDT重复LST首选标准时02:30 LST
LDT重复LST优先夏令时02:30 LDT

其次,关于负夏令时方案:冬季采用LDT,夏季跳过一小时直接过渡到LST,然后在回归冬季时补回这一小时:

LDT跳过LST相对于之前03:30 LST
LDT跳过LST相对于之后01:30 LDT
LDT跳过LST优先于01:30 LDT
LDT跳过LST建议之后03:30 LST
LDT跳过LST首选标准时03:30 当地夏令时
LDT跳过LST首选夏令时01:30 当地夏令时
LST重复LDT相对于之前的时间02:30 LST
LST重复LDT相对于之后02:30 LDT
LST重复LDT优先于02:30 当地夏令时
LST重复LDT建议之后02:30 LDT
LST重复LDT首选标准时02:30 当地夏令时
LST重复LDT优先夏令时02:30 LDT

“Reject”可用于提示相关的QDateTime API 返回一个无效的日期时间对象,以便您的代码能够自行处理过渡情况,例如提醒用户他们所选的日期时间处于过渡区间内,从而为他们提供解决冲突或歧义的机会。 使用此方法的代码可能会发现上述其他选项很有用,可据此确定在自身(或用户)的解决过程中应使用的相关信息。如果过渡的开始或结束时间,或是过渡发生的时刻本身就是正确的解决方案,则可以使用QTimeZone 的过渡 API 来获取该信息。 您可以通过调用secsTo() 来测量前一天和后一天正午之间的实际时间,从而判断该转换是重复间隔还是跳过间隔。对于跳过间隔(如夏令时开始),结果将小于 48 小时;对于重复间隔(如夏令时结束),结果将大于 48 小时。

注意:当 指定“Reject”以外的处理方式时 ,系统会在可能的情况下返回一个有效的QDateTime 对象。如果请求的日期时间处于时间间隙内,返回的日期时间将不包含所请求的time()——或者在某些情况下,如果跳过了一整天,则不包含date()。 因此,您可以通过将date()和time()的结果与请求值进行比较,来检测是否遇到了日期缺口。

与其他日期时间软件的关系

Python 编程语言的 datetime API 包含一个fold 参数,该参数对应于RelativeToBefore (fold = True )和RelativeToAfter (fold = False )。

旨在取代 JavaScript 中Date 的Temporal 提案,为disambiguation 参数的取值提供了四种过渡处理方式。其中的'reject' 会抛出异常,这大致对应于Reject 返回无效结果的情况。其'earlier' 和'later' 选项分别对应于PreferBefore 和PreferAfter 。其'compatible' 选项则对应于RelativeToBefore (以及 Python 中的fold = True )。

该枚举类型在 Qt 6.7 中引入。

另请参阅 Timezone transitions 。

enum class QDateTime::YearRange

此枚举类型描述了QDateTime 所能表示的年份范围(以公历计):

常量值描述
QDateTime::YearRange::First-292275056该年的后半部分可被表示
QDateTime::YearRange::Last+292278994该年的早期部分可表示

可表示的精确起始和结束日期时间均落在这些年份之内,且取决于所使用的timeRepresentation()函数。可通过向fromMSecsSinceEpoch()函数传递适当的值来确定这些时间。

严格介于这两年之间的所有日期均可表示。但请注意,格里高利历中没有零年。

注意: QDate 可以描述更广泛年份范围内的日期。对于大多数用途而言,这几乎没有区别,因为QDateTime 支持的年份范围在 1970 年前后各延伸 2.92 亿年。

另请参阅 isValid() 和QDate 。

成员函数文档

QDateTime::QDateTime(QDate date, QTime time, const QTimeZone &timeZone, QDateTime::TransitionResolution resolve = TransitionResolution::LegacyBehavior)

根据给定的date 和time ,并采用timeZone 中描述的时间表示法,构建一个 datetime 对象。

如果date 有效而time 无效,则时间将设为午夜。如果timeZone 无效,则该日期时间对象将无效。如果date 和time 描述的时刻接近timeZone 的过渡点,则resolve 控制该情况的处理方式。

注意:在 Qt 6.7之前 ,该函数的版本缺少resolve 参数,因此无法解决与过渡相关的歧义。

[noexcept] QDateTime::QDateTime()

构建一个空的日期时间对象,名义上使用本地时间。

空日期时间是无效的,因为其日期和时间均无效。

另请参阅 isValid()、setMSecsSinceEpoch()、setDate()、setTime() 以及setTimeZone()。

[since 6.5] QDateTime::QDateTime(QDate date, QTime time, QDateTime::TransitionResolution resolve = TransitionResolution::LegacyBehavior)

根据给定的date 和time ,使用本地时间构建一个日期时间对象。

如果date 有效而time 无效,则将使用午夜作为时间。如果date 和time 描述的时刻接近本地时间的转换点,则resolve 控制如何解决这种情况。

注意:在 Qt 6.7之前 ,该函数的版本缺少resolve 参数,因此无法解决与时间转换相关的歧义。

这是一个重载函数。

该函数于 Qt 6.5 中引入。

[noexcept] QDateTime::QDateTime(const QDateTime &other)

创建other 日期时间对象的副本。

[noexcept] QDateTime::QDateTime(QDateTime &&other)

将临时other 数据时间的内容移动到此对象中,并将other 置于未指定(但正确)的状态。

[noexcept] QDateTime::~QDateTime()

销毁该日期时间。

QDateTime QDateTime::addDays(qint64 ndays) const

返回一个QDateTime 对象,其中包含一个比该对象的日期时间晚ndays 天的日期时间(如果ndays 为负数,则为更早的时间)。

如果timeSpec() 的参数为Qt::LocalTime 或Qt::TimeZone ,且生成的日期和时间落在标准时间向夏令时过渡的小时内,则结果将略微超出该时间段,且朝向时间变更的方向。 如果转换时间是凌晨 2 点,时钟将拨快至凌晨 3 点,那么瞄准凌晨 2 点至 3 点之间的结果将被调整为落在凌晨 2 点之前(如果ndays < 0 )或凌晨 3 点之后(否则)。

另请参阅 daysTo()、addMonths()、addYears()、addSecs() 以及Timezone transitions 。

[since 6.4] QDateTime QDateTime::addDuration(std::chrono::milliseconds msecs) const

返回一个QDateTime 对象,其中包含一个比该对象的日期时间晚msecs 毫秒的日期时间(如果msecs 为负数,则返回比该对象的日期时间更早的日期时间)。

如果该日期时间无效,则将返回一个无效的日期时间。

注意:将 以std::chrono::months 或std::chrono::years 表示的时长相加, 其结果与使用addMonths()或addYears()所获得的结果并不相同。前者是基于太阳年计算的固定时长;后者则使用公历中对月/年的定义。

该函数于 Qt 6.4 中引入。

另请参阅 addMSecs()、msecsTo()、addDays()、addMonths() 以及addYears()。

QDateTime QDateTime::addMSecs(qint64 msecs) const

返回一个QDateTime 对象,其中包含一个比该对象的日期时间晚msecs 毫秒的日期时间(如果msecs 为负数,则返回较早的日期时间)。

如果该日期时间无效,则会返回一个无效的日期时间。

另请参阅 addSecs()、msecsTo()、addDays()、addMonths() 和addYears()。

QDateTime QDateTime::addMonths(int nmonths) const

返回一个QDateTime 对象,其中包含一个比该对象的日期时间晚nmonths 个月的日期时间(如果nmonths 为负数,则为更早的时间)。

如果 `timeSpec()` 的 `Qt::LocalTime ` 或 `Qt::TimeZone ` 参数指定了具体时间,且生成的日期和时间落在标准时间向夏令时的转换时段内,则结果将略微超出该时间间隙,且方向与时间变更方向一致。 如果转换发生在凌晨 2 点,时钟将向前调整至凌晨 3 点,那么瞄准凌晨 2 点至凌晨 3 点之间的结果将被调整为落在凌晨 2 点之前(如果nmonths < 0 )或凌晨 3 点之后(否则)。

另请参阅 daysTo()、addDays()、addYears()、addSecs() 以及Timezone transitions 。

QDateTime QDateTime::addSecs(qint64 s) const

返回一个QDateTime 对象,其中包含一个比该对象的日期时间晚s 秒的日期时间(如果s 为负数,则返回更早的日期时间)。

如果该日期时间无效,则将返回一个无效的日期时间。

另请参阅 addMSecs()、secsTo()、addDays()、addMonths() 和addYears()。

QDateTime QDateTime::addYears(int nyears) const

返回一个QDateTime 对象,其中包含一个比该对象的日期时间晚nyears 年的日期时间(如果nyears 为负数,则返回更早的日期时间)。

如果 `timeSpec()` 的 `Qt::LocalTime ` 或 `Qt::TimeZone ` 参数指定了特定时间,且生成的日期和时间落在标准时间向夏令时过渡的小时内,则结果将略微超出该时间间隙,且方向与时间变更方向一致。 如果转换时间是凌晨 2 点,时钟将向前调整至凌晨 3 点,那么瞄准凌晨 2 点至 3 点之间的结果将被调整为落在凌晨 2 点之前(如果nyears < 0 )或凌晨 3 点之后(否则)。

另请参阅 daysTo()、addDays()、addMonths()、addSecs() 以及Timezone transitions 。

[static, since 6.5] QDateTime QDateTime::currentDateTime(const QTimeZone &zone)

返回系统时钟的当前日期和时间,采用zone 中描述的时间表示法。如果省略zone ,则使用本地时间。

该函数在 Qt 6.5 中引入。

另请参阅 currentDateTimeUtc()、QDate::currentDate()、QTime::currentTime() 以及toTimeZone()。

[static] QDateTime QDateTime::currentDateTime()

该函数重载了QDateTime::currentDateTime()。

[static] QDateTime QDateTime::currentDateTimeUtc()

返回系统时钟的当前日期和时间,以UTC格式表示。

等同于 `currentDateTime(QTimeZone::UTC)`。

另请参阅 currentDateTime()、QDate::currentDate()、QTime::currentTime() 以及toTimeZone()。

[static noexcept] qint64 QDateTime::currentMSecsSinceEpoch()

返回自1970年UTC起算至今的毫秒数。

该数值类似于 POSIX 的 time_t 变量,但以毫秒为单位而非秒。

另请参阅 currentDateTime()、currentDateTimeUtc() 和toTimeZone()。

[static noexcept] qint64 QDateTime::currentSecsSinceEpoch()

返回自1970年UTC时间起算以来的秒数。

该数值类似于 POSIX 中的 time_t 变量。

另请参阅 currentMSecsSinceEpoch()。

QDate QDateTime::date() const

返回 datetime 对象中的日期部分。

另请参阅 setDate()、time() 和timeRepresentation()。

qint64 QDateTime::daysTo(const QDateTime &other) const

返回从当前日期时间到other 日期时间的天数。

天数的计算方式是统计从当前日期时间到other 日期时间之间,午夜到达的次数。这意味着从23:55到次日0:05的10分钟时间差,计为一天。

如果other 的日期时间早于当前日期时间,则返回负数。如果任一日期时间无效,则返回值为0。

示例:

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); // Make endDate before startDate.
qDebug() << "Days from startDate to endDate: " << startDate.daysTo(endDate);

另请参阅 addDays()、secsTo() 和msecsTo()。

[static] QDateTime QDateTime::fromCFDate(CFDateRef date)

创建一个新的QDateTime 对象,其中包含CFDatedate 的副本。

另请参阅 toCFDate()。

[static] QDateTime QDateTime::fromMSecsSinceEpoch(qint64 msecs, const QTimeZone &timeZone)

返回一个表示特定时刻的日期时间对象,该时刻距离1970年UTC起始时间(如timeZone 所指定)后的指定毫秒数msecs 。默认的时间表示形式为本地时间。

请注意,msecs 的取值可能超出QDateTime 规定的有效范围,包括正数和负数。对于这些值,该函数的行为未定义。

另请参阅 fromSecsSinceEpoch()、toMSecsSinceEpoch() 和setMSecsSinceEpoch()。

[static] QDateTime QDateTime::fromMSecsSinceEpoch(qint64 msecs)

该函数重载了QDateTime::fromMSecsSinceEpoch()。

[static] QDateTime QDateTime::fromNSDate(const NSDate *date)

创建一个新的QDateTime ,其中包含 NSDatedate 的副本。

另请参阅 toNSDate()。

[static] QDateTime QDateTime::fromSecsSinceEpoch(qint64 secs, const QTimeZone &timeZone)

返回一个表示特定时刻的日期时间对象,该时刻为自1970年(UTC)起经过指定秒数secs 后的时刻,具体格式由timeZone 规定。默认的时间表示形式为本地时间。

请注意,secs 的取值可能超出QDateTime 的有效范围,包括负值和正值。对于这些值,本函数的行为未定义。

另请参阅 fromMSecsSinceEpoch()、toSecsSinceEpoch() 和setSecsSinceEpoch()。

[static] QDateTime QDateTime::fromSecsSinceEpoch(qint64 secs)

该函数重载了QDateTime::fromSecsSinceEpoch()。

[static, since 6.4] QDateTime QDateTime::fromStdLocalTime(const std::chrono::local_time<std::chrono::milliseconds> &time)

构建一个日期时间对象,其日期和时间由time 表示的毫秒数构成,该数值是从本地时间1970-01-01T00:00:00.000开始计数的(Qt::LocalTime )。

注意:此 函数需要 C++20。

该函数于 Qt 6.4 中引入。

另请参阅 toStdSysMilliseconds() 和fromMSecsSinceEpoch()。

[static, since 6.4] template <typename Clock, typename Duration> QDateTime QDateTime::fromStdTimePoint(const std::chrono::time_point<Clock, Duration> &time) requires requires(const std::chrono::time_point<Clock, Duration> &t) { // the clock can be converted to system_clock std::chrono::clock_cast<std::chrono::system_clock>(t); // after the conversion to system_clock, the duration type // we get is convertible to milliseconds requires std::is_convertible_v< system_clock_cast_duration<Clock, Duration>, std::chrono::milliseconds >; }

构建一个表示与time 同一时间点的数据时间对象,并使用Qt::UTC 作为其时间表示形式。

time 的时钟必须与std::chrono::system_clock 兼容;特别是,必须存在由std::chrono::clock_cast 支持的转换。转换后,结果的时长类型必须可转换为std::chrono::milliseconds 。

如果不符合上述条件,调用方必须执行必要的时钟转换以转换为std::chrono::system_clock ,并执行必要的持续时间类型转换(强制类型转换/四舍五入/取整下限/取整上限等),以确保该函数的输入满足上述约束条件。

注意:此 函数需要 C++20。

该函数在 Qt 6.4 中引入。

另请参阅 toStdSysMilliseconds() 和fromMSecsSinceEpoch()。

[static, since 6.4] QDateTime QDateTime::fromStdTimePoint(const std::chrono::local_time<std::chrono::milliseconds> &time)

构建一个日期时间对象,其日期和时间即为time 所表示的毫秒数,该数值是从本地时间1970-01-01T00:00:00.000(Qt::LocalTime )开始计数的。

注意:此 函数需要 C++20。

该函数在 Qt 6.4 中引入。

另请参阅 toStdSysMilliseconds() 和fromMSecsSinceEpoch()。

[static, since 6.4] QDateTime QDateTime::fromStdTimePoint(std::chrono::time_point<std::chrono::system_clock, std::chrono::milliseconds> time)

构建一个与time 表示同一时间点的数据时间对象,并使用Qt::UTC 作为其时间表示形式。

此函数重载了QDateTime::fromStdTimePoint()。

该函数于 Qt 6.4 中引入。

[static, since 6.4] QDateTime QDateTime::fromStdZonedTime(const std::chrono::zoned_time<std::chrono::milliseconds, const std::chrono::time_zone *> &time)

构建一个表示与time 相同时间点的数据时间对象。结果将采用time 的时间区表示。

注意:此 函数需要 C++20。

该函数在 Qt 6.4 中引入。

另请参阅 QTimeZone 、toStdSysMilliseconds() 和fromMSecsSinceEpoch()。

[static] QDateTime QDateTime::fromString(const QString &string, const QString &format, int baseYear, QCalendar cal)

返回由string 所表示的QDateTime ,使用给定的format ;如果无法解析该字符串,则返回一个无效的日期时间。

若提供了日历cal ,则使用该日历;否则使用公历。

当format 仅指定年份的最后两位数字时,将首先考虑从baseYear 开始的100个年份作为候选。 在 6.7 版本之前,不存在baseYear 参数,且始终使用 1900 年。这是baseYear 的默认值,用于从该年到 1999 年之间选择年份。在某些情况下,其他字段可能会导致选择下一个或上一个世纪,以确保结果与所有给定的字段保持一致。详情请参阅QDate::fromString()。

除了QDate::fromString()和QTime::fromString()在格式字符串中识别的用于表示日期和时间各部分的表达式外,该方法还支持:

表达式输出
t时区(偏移量、名称、“Z”或带有“UTC”前缀的偏移量)
tt以时差格式表示的时区,小时与分钟之间不加冒号(例如 "+0200")
ttt以偏移量格式表示的时区,小时和分钟之间带有冒号(例如“+02:00”)
tttt时区名称,可以是QTimeZone::displayName() 针对QTimeZone::LongName 返回的结果,也可以是该时区的 IANA 标识符(例如 "Europe/Berlin")。系统识别的名称需符合QTimeZone 中的定义,具体名称可能因所用操作系统而异。

如果不存在 't' 格式指定符,则使用系统的本地时区。有关所有其他字段的默认值,请参阅QDate::fromString() 和QTime::fromString()。

例如:

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.

任何用单引号括起的非空字符序列也将被视为文本(去除引号),而不会被解释为表达式。 两个连续的单引号("''")将被视为一个单引号,用于与输入内容匹配,而非作为原样序列的开头或结尾。所有其他输入字符都将被视为原样文本,用于与输入字符串进行匹配。例如:

QTime time1 = QTime::fromString("131", "HHh");
// time1 is 13:00:00
QTime time2 = QTime::fromString("1apA", "1amAM");
// time2 is 01:00:00

QDateTime dateTime2 = QDateTime::fromString("M1d1y9800:01:02",
                                            "'M'M'd'd'y'yyhh:mm:ss");
// dateTime is 1 January 1998 00:01:02

如果格式不正确,将返回一个无效的QDateTime 。

当数字字段紧邻排列且没有分隔符来分割数字序列时,可能会出现歧义:某些允许使用一位数的字段是否使用了两位数(因为要表示的值大于9)。 若为该字段分配两位数会导致其他字段可用位数不足,且单位数读数与其他字段一致,则可解决此歧义。 否则(即当多个字段被允许仅使用一位数字,且若每个字段只用一位数字时会剩余位数),在数据保持一致的前提下,优先采用将额外位数分配给前序字段的处理方式,而非分配给后序字段。例如:

不带前导零的表达式(d、M、h、m、s、z)将采用贪婪策略。这意味着即使这会导致其超出范围和/或使其他部分的位数不足,它们仍会使用两位(或 z 的三位)。

QDateTime dateTime = QDateTime::fromString("130", "Mm"); // January, 30 mins

这本可能表示 1 月 1 日 00:30.00,但 M 字段会占用两个数字。

若string 的字段指定不正确,将返回无效的QDateTime 。仅支持本地时间从公元100年年初到9999年年底之间的日期时间。 请注意,在其他时区(特别是 UTC)中,接近此范围两端的日期和时间可能会超出该范围(从而被视为无效),具体取决于当地时区。

注意:日期和 月份名称以及 AM/PM 标识必须使用英语(C 语言环境)。如果需要识别本地化的月份和日期名称或本地化的 AM/PM 形式,请使用QLocale::system().toDateTime()。

注意:如果 某个格式字符的重复次数超过了上表中使用该字符的最长表达式,则该格式部分将被解析为多个不带分隔符的表达式;即上表中最长的表达式(可能重复该字符的次数与该字符出现的次数相同),末尾可能是一个较短的表达式。 因此,'tttttt' 将匹配"Europe/BerlinEurope/Berlin" 并将时区设置为柏林时间;如果日期时间字符串包含“Europe/BerlinZ”,它虽然会“匹配”,但会产生不一致的结果,导致日期时间无效。

另请参阅 toString()、QDate::fromString()、QTime::fromString() 以及QLocale::toDateTime()。

[static, since 6.0] QDateTime QDateTime::fromString(QStringView string, Qt::DateFormat format = Qt::TextDate)

该函数重载了QDateTime::fromString()。

该函数在 Qt 6.0 中引入。

[static] QDateTime QDateTime::fromString(const QString &string, Qt::DateFormat format = Qt::TextDate)

返回由string 表示的QDateTime ,使用给定的format 进行转换;如果无法进行转换,则返回一个无效的日期时间对象。

关于Qt::TextDate 的说明:仅识别英文月份的简写形式(例如简写形式的“Jan”或全称形式的“January”)。

这是一个重载函数。

另请参阅 toString() 和QLocale::toDateTime()。

[static, since 6.0] QDateTime QDateTime::fromString(QStringView string, QStringView format, QCalendar cal)

该函数重载了QDateTime::fromString()。

该函数在 Qt 6.0 中引入。

[static, since 6.7] QDateTime QDateTime::fromString(QStringView string, QStringView format, int baseYear = QLocale::DefaultTwoDigitBaseYear)

使用默认构造的QCalendar 。

该函数重载了QDateTime::fromString()。

该函数在 Qt 6.7 中引入。

[static, since 6.0] QDateTime QDateTime::fromString(const QString &string, QStringView format, QCalendar cal)

该函数重载了QDateTime::fromString()。

该函数在 Qt 6.0 中引入。

[static, since 6.7] QDateTime QDateTime::fromString(const QString &string, QStringView format, int baseYear = QLocale::DefaultTwoDigitBaseYear)

使用默认构造的QCalendar 。

该函数重载了 `QDateTime::fromString()`。

该函数在 Qt 6.7 中引入。

[static] QDateTime QDateTime::fromString(const QString &string, const QString &format, QCalendar cal)

该函数重载了QDateTime::fromString()。

[static, since 6.7] QDateTime QDateTime::fromString(const QString &string, const QString &format, int baseYear = QLocale::DefaultTwoDigitBaseYear)

使用默认构造的QCalendar 。

该函数重载了QDateTime::fromString()。

该函数在 Qt 6.7 中引入。

[static, since 6.7] QDateTime QDateTime::fromString(QStringView string, QStringView format, int baseYear, QCalendar cal)

该函数重载了QDateTime::fromString()。

该函数在 Qt 6.7 中引入。

[static, since 6.0] QDateTime QDateTime::fromString(const QString &string, QStringView format, int baseYear, QCalendar cal)

该函数重载了QDateTime::fromString()。

该函数在 Qt 6.0 中引入。

bool QDateTime::isDaylightTime() const

如果该日期时间处于夏令时期间,则返回 true。

如果Qt::TimeSpec 不是Qt::LocalTime 或Qt::TimeZone ,则始终返回false。

另请参阅 timeSpec()。

bool QDateTime::isNull() const

如果日期和时间均为空,则返回true ;否则返回false 。空的日期时间是无效的。

另请参阅 QDate::isNull()、QTime::isNull() 和isValid()。

bool QDateTime::isValid() const

如果该日期时间表示一个确定的时刻,则返回true ;否则返回false 。

如果一个日期时间对象的日期和时间均有效,且所用时间表示法能使其组合具有有效含义,则该日期时间对象有效。 当时间表示法为特定时区或本地时间时,某些日期可能会出现该时区在表示中跳过的时段,例如夏令时转换时跳过的一小时(通常发生在春季的某一夜)。 例如,如果夏令时在凌晨 2 点结束,时钟跳转到凌晨 3 点,那么当天 02:00:00 到 02:59:59.999 之间的时间都是无效的。

另请参阅 QDateTime::YearRange 、QDate::isValid() 以及QTime::isValid()。

qint64 QDateTime::msecsTo(const QDateTime &other) const

返回从当前日期时间到other 日期时间的毫秒数。

在执行比较之前,会将这两个日期时间转换为Qt::UTC ,以确保当其中一个日期时间适用夏令时(DST)而另一个不适用时,结果仍然正确。

如果“other ”日期时间早于当前日期时间,则返回负数。如果任一日期时间无效,则返回 0。

另请参阅 addMSecs()、daysTo() 和QTime::msecsTo()。

int QDateTime::offsetFromUtc() const

返回该日期时间的与UTC的时差(以秒为单位)。

结果取决于timeSpec():

  • Qt::UTC 该偏移量为 0。
  • Qt::OffsetFromUTC 偏移量即为最初设置的值。
  • Qt::LocalTime 返回本地时间相对于 UTC 的偏移量。
  • Qt::TimeZone 返回时区所使用的偏移量。

对于最后两种情况,将返回该日期和时间下的偏移量,并考虑夏令时偏移量。 时差是指当地时间或指定时区的时间与 UTC 时间之间的差值;在比 UTC 早的时区(本初子午线以东),时差为正;在比 UTC 晚的时区(本初子午线以西),时差为负。

另请参阅 setTimeZone()。

qint64 QDateTime::secsTo(const QDateTime &other) const

返回从当前日期时间到other 日期时间的秒数。

在执行比较之前,会将这两个日期时间转换为Qt::UTC ,以确保当其中一个日期时间适用夏令时(DST)而另一个不适用时,结果仍然正确。

如果“other ”日期时间早于当前日期时间,则返回负数。如果任一日期时间无效,则返回 0。

示例:

QDateTime now=QDateTime::currentDateTime();
QDateTime xmas(QDate(now.date().year(), 12, 25).startOfDay());
qDebug("There are %d seconds to Christmas", now.secsTo(xmas));

另请参阅 addSecs()、daysTo() 和QTime::secsTo()。

void QDateTime::setDate(QDate date, QDateTime::TransitionResolution resolve = TransitionResolution::LegacyBehavior)

将此日期时间对象的日期部分设置为date 。

如果尚未设置时间,则将其设为午夜。如果date 无效,则该QDateTime 将失效。

如果date 和time() 描述的时刻接近该日期时间对象时间表示形式的过渡点,则resolve 控制如何解决这种情况。

注意:在 Qt 6.7之前 ,该函数的版本缺少resolve 参数,因此无法解决与过渡相关的歧义。

另请参阅 date()、setTime() 和setTimeZone()。

void QDateTime::setMSecsSinceEpoch(qint64 msecs)

将日期和时间设置为1970年UTC时间起算后,经过指定毫秒数(msecs )的时刻。

在不支持时区的系统上,该函数的行为将视同当地时间为Qt::UTC 。

请注意,若向msecs 传递qint64 的最小值(即std::numeric_limits<qint64>::min() ),将导致未定义行为。

另请参见 setSecsSinceEpoch()、toMSecsSinceEpoch() 和fromMSecsSinceEpoch()。

void QDateTime::setSecsSinceEpoch(qint64 secs)

将日期时间设置为1970年UTC时间起始时刻之后secs 秒的某个时刻。

在不支持时区的系统上,该函数的行为将视同当地时间为Qt::UTC 。

另请参阅 setMSecsSinceEpoch()、toSecsSinceEpoch() 和fromSecsSinceEpoch()。

void QDateTime::setTime(QTime time, QDateTime::TransitionResolution resolve = TransitionResolution::LegacyBehavior)

将该日期时间对象的时间部分设置为time 。如果time 无效,则该函数将其设置为午夜。因此,可以通过将其设置为默认值QTime 来清除QDateTime 中已设置的任何时间:

QDateTime dt = QDateTime::currentDateTime();
dt.setTime(QTime());

如果date() 和time 描述的时刻接近该日期时间的时间表示形式的过渡点,则resolve 控制该情况的处理方式。

注意:在 Qt 6.7之前 ,该函数的版本缺少resolve 参数,因此无法解决与过渡相关的歧义。

另请参阅 time()、setDate() 和setTimeZone()。

void QDateTime::setTimeZone(const QTimeZone &toZone, QDateTime::TransitionResolution resolve = TransitionResolution::LegacyBehavior)

将此日期时间所使用的时区设置为toZone 。

该日期时间可能指代不同的时间点。它使用toZone 的时间表示形式,这可能会改变其未更改的date()和time()方法的含义。

如果toZone 无效,则该日期时间也将无效。否则,调用后该日期时间的timeSpec() 将与toZone.timeSpec() 匹配。

如果date() 和time() 描述的时刻接近toZone 的过渡点,则resolve 控制该情况的处理方式。

注意:在 Qt 6.7之前 ,该函数的版本缺少resolve 参数,因此无法解决与转换相关的歧义。

另请参阅 timeRepresentation()、timeZone() 和Qt::TimeSpec 。

[noexcept] void QDateTime::swap(QDateTime &other)

将当前日期时间与other 互换。此操作速度极快,且绝不会失败。

QTime QDateTime::time() const

返回 datetime 对象中的时间部分。

另请参阅 setTime()、date(),以及timeRepresentation()。

[since 6.5] QTimeZone QDateTime::timeRepresentation() const

返回一个QTimeZone ,用于标识该日期时间所表示的时间类型。

返回的QTimeZone 的timeSpec()将与该日期时间所对应的时间表示形式一致;如果该时间表示形式不是Qt::TimeZone ,则返回的QTimeZone 为时间表示形式。当其timeSpec()为Qt::OffsetFromUTC 时,返回的QTimeZone 的fixedSecondsAheadOfUtc()将提供该偏移量。当timeSpec()为Qt::TimeZone 时,QTimeZone 对象本身即为该时区的完整表示。

该函数在 Qt 6.5 中引入。

另请参阅 timeZone()、setTimeZone() 和QTimeZone::asBackendZone()。

Qt::TimeSpec QDateTime::timeSpec() const

返回该日期时间对象的时间表示形式。

该方法将时间表示形式分类为本地时间、UTC、相对于UTC的固定偏移量(不指定偏移量)或时区(不提供该时区的详细信息)。等同于timeRepresentation().timeSpec() 。

另请参阅 setTimeZone()、timeRepresentation()、date() 和time()。

QTimeZone QDateTime::timeZone() const

返回该日期时间所处的时区。

该结果与 `timeRepresentation().asBackendZone()` 相同。在所有情况下,结果的 `timeSpec()` 均为 `Qt::TimeZone`。

当timeSpec() 的Qt::LocalTime 为QDateTime 时,结果将描述调用该方法时的本地时间。即使原始 发生了变化,该结果也不会反映系统时区后续的变更。

另请参阅 timeRepresentation()、setTimeZone()、Qt::TimeSpec 以及QTimeZone::asBackendZone()。

QString QDateTime::timeZoneAbbreviation() const

返回该日期时间的时区缩写。

返回的字符串取决于 `timeSpec()`:

注意: 不能保证缩写 是唯一的,即不同的时区可能有相同的缩写。对于 `Qt::LocalTime ` 和 `Qt::TimeZone`,当由主机系统返回时,缩写可能会根据本地化而有所不同。

另请参阅 timeSpec() 和QTimeZone::abbreviation()。

CFDateRef QDateTime::toCFDate() const

根据QDateTime 创建一个CFDate对象。

调用方拥有该 CFDate 对象,并负责释放它。

另请参阅 fromCFDate()。

QDateTime QDateTime::toLocalTime() const

返回该日期时间的副本,并将其转换为本地时间。

该结果表示与该日期时间相同的时间点,且与该日期时间相等。

示例:

QDateTime UTC(QDateTime::currentDateTimeUtc());
QDateTime local(UTC.toLocalTime());
qDebug() << "UTC time is:" << UTC;
qDebug() << "Local time is:" << local;
qDebug() << "No difference between times:" << UTC.secsTo(local);

另请参阅 toTimeZone()、toUTC() 和toOffsetFromUtc()。

qint64 QDateTime::toMSecsSinceEpoch() const

返回该日期和时间以自1970年UTC起算的毫秒数表示。

在不支持时区的系统上,该函数的行为将等同于将当地时间设为Qt::UTC 。

如果该对象中存储的日期时间无效,则此函数的行为未定义。但是,对于所有有效的日期,此函数都会返回一个唯一的值。

另请参阅 toSecsSinceEpoch()、setMSecsSinceEpoch() 和fromMSecsSinceEpoch()。

NSDate *QDateTime::toNSDate() const

根据QDateTime 创建一个NSDate。

该 NSDate 对象将被自动释放。

另请参阅 fromNSDate()。

QDateTime QDateTime::toOffsetFromUtc(int offsetSeconds) const

返回该日期时间的副本,该副本已转换为符合Qt::OffsetFromUTC 规范且符合给定offsetSeconds 的格式。等同于toTimeZone(QTimeZone::fromSecondsAheadOfUtc(offsetSeconds)) 。

如果offsetSeconds 等于 0,则将返回一个 UTC 日期时间。

结果表示与该日期时间相同的时刻,并且与该日期时间相等。

另请参阅 offsetFromUtc() 和toTimeZone()。

qint64 QDateTime::toSecsSinceEpoch() const

返回该日期和时间以自1970年UTC起算的秒数表示。

在不支持时区的系统上,该函数的行为将视同当地时间为 `Qt::UTC`。

如果该对象中存储的日期时间无效,则此函数的行为未定义。但是,对于所有有效的日期,此函数都会返回一个唯一的值。

另请参阅 toMSecsSinceEpoch()、fromSecsSinceEpoch() 和setSecsSinceEpoch()。

[since 6.4] std::chrono::sys_time<std::chrono::milliseconds> QDateTime::toStdSysMilliseconds() const

使用std::chrono::system_clock 作为时钟,将此日期时间对象转换为以毫秒为单位的等效时间点。

注意:此 函数需要 C++20。

该函数在 Qt 6.4 中引入。

另请参阅 fromStdTimePoint() 和toMSecsSinceEpoch()。

[since 6.4] std::chrono::sys_seconds QDateTime::toStdSysSeconds() const

使用std::chrono::system_clock 作为时钟,将此日期时间对象转换为以秒为单位的等效时间点。

注意:此 函数需要 C++20。

该函数在 Qt 6.4 中引入。

另请参阅 fromStdTimePoint() 和toSecsSinceEpoch()。

QString QDateTime::toString(const QString &format, QCalendar cal) const

QString QDateTime::toString(QStringView format, QCalendar cal) const

将日期和时间作为字符串返回。format 参数决定结果字符串的格式。如果提供了cal ,则该参数决定用于表示日期的日历;默认使用公历。在Qt 5.14之前,不存在cal 参数,且始终使用公历。 有关format 参数中分别支持的时间和日期指定符,请参阅QTime::toString() 和QDate::toString()。

任何用单引号括起的非空字符序列都将原样包含在输出字符串中(去除引号),即使其中包含格式化字符也是如此。 两个连续的单引号("''")在输出中将被替换为一个单引号,而不是作为原样保留序列的开头或结尾。格式字符串中的所有其他字符都会原样包含在输出字符串中。

支持不带分隔符的格式(例如 "ddMM"),但必须谨慎使用,因为生成的字符串并不总是可靠可读的(例如,如果 "dM" 生成 "212",它可能表示 12 月 2 日,也可能表示 2 月 21 日)。

格式字符串示例(假设QDateTime 为2001年5月21日 14:13:09.120):

格式结果
dd.MM.yyyy21.05.2001
ddd MMMM d yy2001年5月21日 周二
hh:mm:ss.zzz14:13:09.120
hh:mm:ss.z14:13:09.12
h:m:s ap下午 2:13:9

如果日期和时间无效,将返回一个空字符串。

注意:日期和 月份名称以及 AM/PM 指示符均采用英语(C 语言环境)。要获取本地化的月份和日期名称以及本地化的 AM/PM 形式,请使用QLocale::system().toDateTime()。

另请参阅 fromString()、QDate::toString()、QTime::toString() 和QLocale::toString()。

QString QDateTime::toString(QStringView format) const

该函数重载了QDateTime::toString()。

QString QDateTime::toString(Qt::DateFormat format = Qt::TextDate) const

将日期和时间作为字符串返回,格式遵循给定的format 。

如果format 为Qt::TextDate ,则字符串将按默认格式显示。星期和月份名称将使用英文。此格式的示例为“Wed May 20 03:40:13 1998”。有关本地化格式,请参阅QLocale::toString()。

若format 为Qt::ISODate ,则字符串格式符合ISO 8601日期和时间表示的扩展规范,采用yyyy-MM-ddTHH:mm:ss[Z|±HH:mm]的形式,具体取决于QDateTime 的timeSpec()。 如果timeSpec()的值为Qt::UTC ,则会在字符串末尾追加Z;如果timeSpec()的值为Qt::OffsetFromUTC ,则会在字符串末尾追加相对于UTC的偏移量(以小时和分钟为单位)。 若要在 ISO 8601 日期中包含毫秒,请使用format Qt::ISODateWithMs ,其格式对应于 yyyy-MM-ddTHH:mm:ss.zzz[Z|±HH:mm]。

如果format 为Qt::RFC2822Date ,则字符串将按照RFC 2822 进行格式化。

如果日期和时间(xml-ph-0000@deepl.internal)无效,则返回一个空字符串。

警告: Qt::ISODate 格式仅对 0 到 9999 之间的年份有效。

此函数重载了QDateTime::toString()。

另请参阅 fromString()、QDate::toString()、QTime::toString() 和QLocale::toString()。

QString QDateTime::toString(const QString &format) const

该函数重载了QDateTime::toString()。

QDateTime QDateTime::toTimeZone(const QTimeZone &timeZone) const

返回该日期时间的副本,并将其转换为指定的timeZone 。

该结果表示与该日期时间相同的时刻,且与该日期时间完全相等。

结果使用timeZone 的时间表示法来描述该时间点。例如:

QDateTime local(QDateTime::currentDateTime());
QDateTime UTC(local.toTimeZone(QTimeZone::UTC));
qDebug() << "Local time is:" << local;
qDebug() << "UTC time is:" << UTC;
qDebug() << "No difference between times represented:" << local.secsTo(UTC);

如果timeZone 无效,则该日期时间也将无效。否则,返回的日期时间的timeSpec() 结果将与timeZone.timeSpec() 匹配。

另请参阅 timeRepresentation()、toLocalTime()、toUTC() 以及toOffsetFromUtc()。

QDateTime QDateTime::toUTC() const

返回该日期时间的副本,并将其转换为UTC时间。

该结果表示与该日期时间相同的时间点,且与该日期时间完全一致。

示例:

QDateTime local(QDateTime::currentDateTime());
QDateTime UTC(local.toUTC());
qDebug() << "Local time is:" << local;
qDebug() << "UTC time is:" << UTC;
qDebug() << "No difference between times:" << local.secsTo(UTC);

另请参阅 toTimeZone()、toLocalTime() 和toOffsetFromUtc()。

[since 6.4] QDateTime &QDateTime::operator+=(std::chrono::milliseconds duration)

通过添加给定的duration 来修改此日期时间对象。

如果duration 为正数,更新后的对象时间将推迟;如果为负数,则时间将提前。返回对此日期时间对象的引用。

如果该日期时间对象无效,则此函数无效果。

该函数在 Qt 6.4 中引入。

另请参阅 addMSecs()。

[since 6.4] QDateTime &QDateTime::operator-=(std::chrono::milliseconds duration)

通过减去给定的duration 来修改此日期时间对象。

如果duration 为正数,更新后的对象时间将更早;如果为负数,则更新后的对象时间将更晚。返回对此datetime对象的引用。

如果该 datetime 对象无效,则此函数将无效果。

此函数在 Qt 6.4 中引入。

另请参阅 addMSecs 。

[noexcept] QDateTime &QDateTime::operator=(const QDateTime &other)

将other 中的日期时间复制到此处,并返回该副本。

相关非成员

[noexcept] bool operator!=(const QDateTime &lhs, const QDateTime &rhs)

如果lhs 与rhs 不同,则返回true ;否则返回false 。

使用不同时间表示法的两个日期时间对象,其相对于 UTC 的偏移量可能不同。在这种情况下,即使它们的date() 和time() 结果不同,只要该差异与 UTC 偏移量的差异相符,它们的比较结果仍可能为相等。如果它们的date() 和time() 相等,则相对于 UTC 偏移量较大的那个比偏移量较小的那个更小(更早)。 因此,日期时间仅具有弱排序关系。

自 5.14 起,所有无效的日期时间都互等,且都小于所有有效的日期时间。

另请参阅 operator==()。

[since 6.4] QDateTime operator+(const QDateTime &dateTime, std::chrono::milliseconds duration)

[since 6.4] QDateTime operator+(std::chrono::milliseconds duration, const QDateTime &dateTime)

返回一个QDateTime 对象,其中包含一个时间戳duration ,该时间戳比dateTime 晚 毫秒(如果duration 为负数,则比 早)。

如果dateTime 无效,则会返回一个无效的日期时间。

这些函数在 Qt 6.4 中引入。

另请参阅 addMSecs()。

[since 6.4] std::chrono::milliseconds operator-(const QDateTime &lhs, const QDateTime &rhs)

返回从lhs 到rhs 的时间(以毫秒为单位)。

如果lhs 早于rhs ,则结果为负数。若任一日期时间无效,则返回 0 毫秒。

该函数在 Qt 6.4 中引入。

另请参阅 msecsTo()。

[since 6.4] QDateTime operator-(const QDateTime &dateTime, std::chrono::milliseconds duration)

返回一个QDateTime 对象,其中包含一个比dateTime 早duration 毫秒的日期时间(如果duration 为负数,则返回比 晚的日期时间)。

如果 `dateTime ` 无效,则会返回一个无效的日期时间。

该函数在 Qt 6.4 中引入。

另请参阅 addMSecs()。

[noexcept] bool operator<(const QDateTime &lhs, const QDateTime &rhs)

如果lhs 早于rhs ,则返回true ;否则返回false 。

使用不同时间表示法的两个日期时间可能具有不同的 UTC 偏移量。在这种情况下,即使它们的date() 和time() 结果不同,只要该差异与 UTC 偏移量的差异相符,它们仍可能被视为等价。如果它们的date() 和time() 相同,则 UTC 偏移量较大的那个比 UTC 偏移量较小的那个更小(更早)。 因此,日期时间仅具有弱排序关系。

自 5.14 版本起,所有无效的日期时间均被视为等价,且都小于所有有效的日期时间。

另请参阅 operator==()。

QDataStream &operator<<(QDataStream &out, const QDateTime &dateTime)

将dateTime 写入out 流。

另请参阅 《Qt 数据类型的序列化》。

[noexcept] bool operator<=(const QDateTime &lhs, const QDateTime &rhs)

如果 `lhs ` 早于或等于 `rhs`,则返回 `true `;否则返回 `false`。

使用不同时间表示法的两个日期时间可能具有不同的 UTC 偏移量。在这种情况下,即使它们的 `date()` 和 `time()` 结果不同,只要该差异与 UTC 偏移量的差异一致,它们仍可能被视为相等。如果它们的 `date() ` 和 `time() ` 相同,则 UTC 偏移量较大的那个比 UTC 偏移量较小的那个更小(更早)。 因此,日期时间仅具有弱排序关系。

自 5.14 起,所有无效的日期时间均被视为等价,且小于所有有效的日期时间。

另请参阅 operator==()。

[noexcept] bool operator==(const QDateTime &lhs, const QDateTime &rhs)

如果lhs 表示与rhs 相同的时间点,则返回true ;否则返回false 。

使用不同时间表示法的两个日期时间可能具有不同的 UTC 偏移量。在这种情况下,即使它们的date() 和time() 结果不同,只要该差异与 UTC 偏移量的差异相符,它们仍可能被视为相等。如果它们的date() 和time() 相同,则 UTC 偏移量较大的那个比偏移量较小的那个更小(更早)。 因此,日期时间仅具有弱顺序。

自 5.14 起,所有无效的日期时间均被视为等价,且均小于所有有效的日期时间。

另请参阅 operator!=()、operator<()、operator<=()、operator>() 以及operator>=()。

[noexcept] bool operator>(const QDateTime &lhs, const QDateTime &rhs)

如果lhs 晚于rhs ,则返回true ;否则返回false 。

使用不同时间表示法的两个日期时间对象可能具有不同的 UTC 偏移量。在这种情况下,即使它们的date() 和time() 结果不同,只要该差异与 UTC 偏移量的差异相符,它们仍可能被视为等价。如果它们的date() 和time() 相等,则 UTC 偏移量较大的那个比 UTC 偏移量较小的那个更小(更早)。 因此,日期时间仅具有弱排序关系。

自 5.14 版本起,所有无效的日期时间均被视为等价,且都小于所有有效的日期时间。

另请参阅 operator==()。

[noexcept] bool operator>=(const QDateTime &lhs, const QDateTime &rhs)

如果lhs 晚于或等于rhs ,则返回true ;否则返回false 。

使用不同时间表示法的两个日期时间对象可能具有不同的 UTC 偏移量。在这种情况下,即使它们的date() 和time() 结果不同,只要该差异与 UTC 偏移量的差异相符,它们在比较时仍可能被视为相等。如果它们的date() 和time() 相同,则 UTC 偏移量较大的那个比偏移量较小的那个更小(更早)。 因此,日期时间仅具有弱排序关系。

自 5.14 版本起,所有无效的日期时间均被视为等价,且都小于所有有效的日期时间。

另请参阅 operator==()。

QDataStream &operator>>(QDataStream &in, QDateTime &dateTime)

从流in 中读取一个日期时间,并将其赋值给dateTime 。

另请参阅 《Qt 数据类型的序列化》。

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.