You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

QDateTime::operator<文档是否错误或表述不当?

QDateTime::operator< 文档与测试结果不符的原因

问题的核心是文档描述的是Qt 5.14及更早版本的行为,而你的测试环境使用的是Qt 5.15或更新版本,两个版本的QDateTime比较逻辑存在重大变更:

1. 旧版本(Qt 5.14及更早)的行为(即文档描述内容)

在Qt 5.14及之前,QDateTime的比较不会自动归一化到UTC,而是直接对比本地日期时间与偏移量的组合:

  • 若两个QDateTime的date()和time()相同,但UTC偏移量不同,偏移量更大的会被判定为"更早"(比如2026-01-31T18:00:00+08:00会小于2026-01-31T18:00:00+00:00)
  • 这种逻辑导致QDateTime是弱排序,可能出现a < b和b < a都不成立,但a != b的情况

2. 新版本(Qt 5.15及之后)的行为(即你的测试结果)

Qt 5.15彻底修改了QDateTime的比较逻辑:

  • 所有比较运算符(<, <=, >, >=, ==)都会先将QDateTime归一化到UTC时间,再对比时间戳
  • 只要两个QDateTime代表的绝对时间相同(比如你的time1、time3、time4),无论偏移量如何,==都会返回true,排序变为符合直觉的强排序
  • 无效日期的规则保持不变:所有无效QDateTime相等,且小于所有有效QDateTime(你的测试中notime < time1返回true也符合这一点)

你的测试验证

测试代码

QDateTime   notime = QDateTime::fromString( "", Qt::ISODate );
QDateTime   time1 = QDateTime::fromString( "2026-01-31T18:00:00Z", Qt::ISODate );
QDateTime   time2 = QDateTime::fromString( "2026-01-31T18:00:00-06:00", Qt::ISODate );
QDateTime   time3 = QDateTime::fromString( "2026-01-31T12:00:00-06", Qt::ISODate );
QDateTime   time4 = QDateTime::fromString( "2026-02-01T00:00:00+06", Qt::ISODate );

qDebug() << "notime valid?" << notime.isValid();
qDebug() << "time1" << time1.toString( Qt::ISODate ) << "==" << time1.toUTC().toString( Qt::ISODate );
qDebug() << "time2" << time2.toString( Qt::ISODate ) << "==" << time2.toUTC().toString( Qt::ISODate );
qDebug() << "time3" << time3.toString( Qt::ISODate ) << "==" << time3.toUTC().toString( Qt::ISODate );
qDebug() << "time4" << time4.toString( Qt::ISODate ) << "==" << time4.toUTC().toString( Qt::ISODate );

qDebug() << "noime <=> time1" << (notime < time1) << (notime == time1) << (notime > time1);
qDebug() << "time1 <=> time2" << (time1 < time2) << (time1 == time2) << (time1 > time2);
qDebug() << "time1 <=> time3" <<  (time1 < time3) << (time1 == time3) << (time1 > time3);
qDebug() << "time1 <=> time4" <<  (time1 < time4) << (time1 == time4) << (time1 > time4);

测试结果

notime valid? false
time1 "2026-01-31T18:00:00Z" == "2026-01-31T18:00:00Z"
time2 "2026-01-31T18:00:00-06:00" == "2026-02-01T00:00:00Z"
time3 "2026-01-31T12:00:00-06:00" == "2026-01-31T18:00:00Z"
time4 "2026-02-01T00:00:00+06:00" == "2026-01-31T18:00:00Z"
noime <=> time1 true false false
time1 <=> time2 true false false
time1 <=> time3 false true false
time1 <=> time4 false true false

这个结果完全符合Qt 5.15+的行为:所有代表同一绝对时间的QDateTime被判定为相等,排序基于UTC时间戳。

内容的提问来源于stack exchange,提问作者Ed K

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.01 13:22:43