diff --git a/src/corelib/time/qtimezone.cpp b/src/corelib/time/qtimezone.cpp index 85989154e79..4976ea5fcb8 100644 --- a/src/corelib/time/qtimezone.cpp +++ b/src/corelib/time/qtimezone.cpp @@ -532,7 +532,9 @@ QTimeZone::QTimeZone(int offsetSeconds) QTimeZone::QTimeZone(const QByteArray &zoneId, int offsetSeconds, const QString &name, const QString &abbreviation, QLocale::Territory territory, const QString &comment) - : d(isTimeZoneIdAvailable(zoneId) ? nullptr // Don't let client code hijack a real zone name. + : d(QUtcTimeZonePrivate().isTimeZoneIdAvailable(zoneId) + || global_tz->backend->isTimeZoneIdAvailable(zoneId) + ? nullptr // Don't let client code hijack a real zone name. : new QUtcTimeZonePrivate(zoneId, offsetSeconds, name, abbreviation, territory, comment)) { } @@ -1420,6 +1422,7 @@ bool QTimeZone::isTimeZoneIdAvailable(const QByteArray &ianaId) return false; #endif return QUtcTimeZonePrivate().isTimeZoneIdAvailable(ianaId) + || QUtcTimeZonePrivate::offsetFromUtcString(ianaId) != QTimeZonePrivate::invalidSeconds() || global_tz->backend->isTimeZoneIdAvailable(ianaId); } diff --git a/src/corelib/time/qtimezoneprivate.cpp b/src/corelib/time/qtimezoneprivate.cpp index f007b05d58f..3a9bc695cbf 100644 --- a/src/corelib/time/qtimezoneprivate.cpp +++ b/src/corelib/time/qtimezoneprivate.cpp @@ -919,7 +919,9 @@ bool QUtcTimeZonePrivate::isTimeZoneIdAvailable(const QByteArray &ianaId) const if (isEntryInIanaList(ianaId, data.id())) return true; } - // But see offsetFromUtcString(), which lets us accept some "unavailable" IDs. + // Callers may want to || offsetFromUtcString(ianaId) != invalidSeconds(), + // but those are technically not IANA IDs and the custom QTimeZone + // constructor needs the return here to reflect that. return false; } diff --git a/tests/auto/corelib/time/qtimezone/tst_qtimezone.cpp b/tests/auto/corelib/time/qtimezone/tst_qtimezone.cpp index ff6f96c1a05..29643b2caca 100644 --- a/tests/auto/corelib/time/qtimezone/tst_qtimezone.cpp +++ b/tests/auto/corelib/time/qtimezone/tst_qtimezone.cpp @@ -538,6 +538,12 @@ void tst_QTimeZone::isTimeZoneIdAvailable() QVERIFY2(QTimeZone::isTimeZoneIdAvailable(id), id); QVERIFY2(QTimeZone(id).isValid(), id); } + for (qint32 offset = QTimeZone::MinUtcOffsetSecs; + offset <= QTimeZone::MinUtcOffsetSecs; ++offset) { + const QByteArray id = QTimeZone(offset).id(); + QVERIFY2(QTimeZone::isTimeZoneIdAvailable(id), id); + QVERIFY2(QTimeZone(id).isValid(), id); + } } void tst_QTimeZone::utcOffsetId_data()