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
相关产品推荐
相关产品推荐

