关于 `QDateTime::operator<` 的文档是错误,还是措辞不当?

编程语言 2026-07-10

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() 值的两个对象是不同的,但它们的比较结果可能是等效的。举例来说,提供的示例中的 time1time2time3 因为存储了不同的时区而不同,但它们的比较结果是等效的。你的测试显示排序是弱的。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章