我在Qt 4.8的QDateTime中发现了有关fromMSecsSinceEpoch的奇怪行为。以下代码不会产生我期望的结果:

assert(
    QDateTime::fromMSecsSinceEpoch(
        std::numeric_limits<qint64>::max()
    ).isValid() == true
);
assert(
    QDateTime::fromMSecsSinceEpoch(
        std::numeric_limits<qint64>::max()
    ).toMSecsSinceEpoch() == std::numeric_limits<qint64>::max()
);

当第一个断言为真时,第二个断言失败。 Qt返回的结果是-210866773624193QDateTime::fromMSecsSinceEpoch(qint64 msecs)doc明确指出:



但是,没有关于有效范围的任何明确声明。

我在Qt 5.5.1、5.6.0和5.7.0 Beta中找到有关时区问题的Qt bug report
我不确定这是否是类似的错误,或者我提供给QDateTime::fromMSecsSinceEpoch(qint64 msecs)的值仅仅是无效的。

可以传递给此函数并产生正确行为的最大值是(或者应该是)最大值?

最佳答案

std::numeric_limits<qint64>::max() ms产生9 223 372 036 854 775 807 ms9 223 372 036 854 775 s2 562 047 788 015 hours106 751 991 167 days292 471 208 years:在QDateTime的有效范围内,这远远超过了1100万年。

the doc开始,有效日期从公元前4713年1月2日开始,一直到QDate::toJulianDay()溢出为止:2^31 days(带符号整数的最大值)产生的近似5 000 000 years。那是185 542 587 187 200 000 ms(从公元前4713年1月2日起,不是从Epoch来的),比2^57小得多。

编辑:

在评论中进行讨论之后,您检查了Qt4.8源,并发现fromMSecsSinceEpoch()在内部使用QDate(1970, 1, 1).addDays(ddays),其中天数直接从msecs参数计算得出。

由于此处ddays的类型为int,因此对于大于2^31的值,它将溢出。

关于c++ - QDateTime::fromMSecsSinceEpoch的有效范围,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40736763/

10-14 16:37