gpt4 book ai didi

c++ - QDateTime::fromMSecsSinceEpoch 的有效范围

转载 作者:搜寻专家 更新时间:2023-10-31 02:13:50 30 4
gpt4 key购买 nike

我在 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 的返回结果是-210866773624193doc对于 QDateTime::fromMSecsSinceEpoch(qint64 msecs) 明确指出:

There are possible values for msecs that lie outside the valid range of QDateTime, both negative and positive. The behavior of this function is undefined for those values.

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

我找到了这个 Qt bug report关于 Qt 5.5.1、5.6.0 和 5.7.0 Beta 中的时区问题。我不确定这是否是一个类似的错误,或者我提供给 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 日开始,不是来自大纪元),“小”多于 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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com