我在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返回的结果是
-210866773624193
。QDateTime::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 ms
或9 223 372 036 854 775 s
或2 562 047 788 015 hours
或106 751 991 167 days
或292 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/