diff --git a/src/corelib/time/qdatetime.cpp b/src/corelib/time/qdatetime.cpp index c3e9b49b25e..504ededb56f 100644 --- a/src/corelib/time/qdatetime.cpp +++ b/src/corelib/time/qdatetime.cpp @@ -2824,11 +2824,13 @@ QDateTimePrivate::ZoneState QDateTimePrivate::expressUtcAsLocal(qint64 utcMSecs) #if QT_CONFIG(timezone) // Use the system time-zone. if (const auto sys = QTimeZone::systemTimeZone(); sys.isValid()) { result.offset = sys.d->offsetFromUtc(utcMSecs); - if (qAddOverflow(utcMSecs, result.offset * MSECS_PER_SEC, &result.when)) + if (result.offset != QTimeZonePrivate::invalidSeconds()) { + if (qAddOverflow(utcMSecs, result.offset * MSECS_PER_SEC, &result.when)) + return result; + result.dst = sys.d->isDaylightTime(utcMSecs) ? DaylightTime : StandardTime; + result.valid = true; return result; - result.dst = sys.d->isDaylightTime(utcMSecs) ? DaylightTime : StandardTime; - result.valid = true; - return result; + } } #endif // timezone diff --git a/src/corelib/time/qtimezoneprivate.cpp b/src/corelib/time/qtimezoneprivate.cpp index d06c1aa6625..17b32ec2e8e 100644 --- a/src/corelib/time/qtimezoneprivate.cpp +++ b/src/corelib/time/qtimezoneprivate.cpp @@ -341,6 +341,12 @@ QDateTimePrivate::ZoneState QTimeZonePrivate::stateAtZoneTime( Q_ASSERT(recent < imminent && seventeenHoursInMSecs < imminent - recent + 1); const Data past = data(recent), future = data(imminent); + if (future.atMSecsSinceEpoch == invalidMSecs() + && past.atMSecsSinceEpoch == invalidMSecs()) { + // Failed to get any useful data near this time: apparently out of range + // for the backend. + return { forLocalMSecs }; + } // > 99% of the time, past and future will agree: if (Q_LIKELY(past.offsetFromUtc == future.offsetFromUtc && past.standardTimeOffset == future.standardTimeOffset