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

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

相关文章