关于 `QDateTime::operator<` 的文档是错误,还是措辞不当?
两个使用不同时间表示的日期时间对象可能相对于UTC有不同的偏移量。在这种情况下,即使它们的 date() 和 time() 不同,只要它们之间的差异与UTC偏移量的差异相匹配,它们仍可能被视为等效进行比较。如果它们的
date()和time()相符,具有更高UTC偏移量的那个将小于(更早)于具有较低偏移量的那个。因此,日期时间对象的排序是“弱有序”的自5.14以来,所有无效的日期时间都等效,且小于所有有效的日期时间。
这听起来像是没有对时间进行规范化,偏移量会影响比较吗?我理解成:即使绝对时间实际上相同,只要偏移量不同,比较结果就不会被视为完全相同。此外,最后一行似乎在说 invalid <= valid 应该为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
解决方案
听起来像是没有对时间进行规范化,偏移量会影响比较?
不,它确实在对时间进行规范化,因为偏移量会影响比较。
我理解这意味着即使绝对时间实际相同,只要偏移量不同,比较就不会相同。
你可以怎么理解都可以,但引文所说的是相反的:即使本地时间不同(也就是如果它们的 date() 或 time() 不同),它们也可能被比较为等效,只要绝对时间实际相同(也就是说,只要本地时间的差异与时区的差异相匹配)。
最后一行似乎在说
invalid <= valid应该为true吗?
嗯,它确实暗示了这一点,但它写的是“比所有有效日期时间都小”(less than all valid datetimes),而不是“比所有有效日期时间都小或等于”(less than or equal to all valid datetimes)。最后一行提到的唯一等价关系是所有无效的 QDateTime 对象彼此等价。如果你读到文中没有的东西,你很可能会产生误解。
语法注意:
在句子 "all invalid datetimes are equivalent and less than all valid datetimes" 中,有一种理解是短语 "than all valid datetimes" 同时作用于 "equivalent" 和 "less than"。然而,"equivalent than all valid datetimes" 并不符合语法。为了把 "equivalent" 与 "all valid datetimes" 连接起来,需要不同的介词,例如在类似但显著不同的表述 "all invalid datetimes are equivalent to and less than all valid datetimes" 中所使用的介词。(仍然存在一个问题,那就是不可能在同时与某物等价并小于它,这是一个逻辑问题而非语法问题。)
在我的测试中,时间似乎是强排序(规范化),
规范化正是让排序变成“弱排序”的原因。返回不同的 time() 值的两个对象是不同的,但它们的比较结果可能是等效的。举例来说,提供的示例中的 time1、time2 和 time3 因为存储了不同的时区而不同,但它们的比较结果是等效的。你的测试显示排序是弱的。