sigy - 4 months ago 27

C++ Question

I discovered a strange behavior in

`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()

);

While the first assertion is true, the second fails. The returned result from Qt is

`-210866773624193`

The doc for

`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.

However, there is no any explicit statement about the valid range.

I found this Qt bug report about an issue regarding timezones in Qt 5.5.1, 5.6.0 and 5.7.0 Beta.

I am not sure wheter this is a similar bug, or if the value I provided to

`QDateTime::fromMSecsSinceEpoch(qint64 msecs)`

What is (or rather should be) the maximum value that can be passed to this function and yields correct behavior?

Answer

`std::numeric_limits<qint64>::max() ms`

yields `9 223 372 036 854 775 807 ms`

, or `9 223 372 036 854 775 s`

, or `2 562 047 788 015 hours`

, or `106 751 991 167 days`

, or `292 471 208 years`

: that's far beyond the year 11 million in the valid range of `QDateTime`

.

From the doc, valid dates start from January 2nd, 4713 BCE, and go until `QDate::toJulianDay()`

overflow: `2^31 days`

(max value for signed integer) yields nearly `5 000 000 years`

. That's `185 542 587 187 200 000 ms`

(from January 2nd, 4713 BCE, not from Epoch), "little" more than `2^57`

.