diff --git a/src/corelib/time/qtimezone.cpp b/src/corelib/time/qtimezone.cpp index c593af544f0..9839107e80a 100644 --- a/src/corelib/time/qtimezone.cpp +++ b/src/corelib/time/qtimezone.cpp @@ -1504,9 +1504,13 @@ QList QTimeZone::availableTimeZoneIds(QLocale::Territory territory) Returns a list of all available IANA time zone IDs with a given standard time offset of \a offsetSeconds. + Where the given offset is supported, \c{QTimeZone(offsetSeconds).id()} is + included in the list, even if it is not an IANA ID. This only arises when + there is no IANA UTC-offset ID with the given offset. + This method is only available when feature \c timezone is enabled. - \sa isTimeZoneIdAvailable() + \sa isTimeZoneIdAvailable(), QTimeZone(int) */ QList QTimeZone::availableTimeZoneIds(int offsetSeconds) diff --git a/src/corelib/time/qtimezoneprivate.cpp b/src/corelib/time/qtimezoneprivate.cpp index 97f2f85e52a..71b1674b846 100644 --- a/src/corelib/time/qtimezoneprivate.cpp +++ b/src/corelib/time/qtimezoneprivate.cpp @@ -989,6 +989,12 @@ QList QUtcTimeZonePrivate::availableTimeZoneIds(qint32 offsetSeconds } result << id.toByteArray(); } + // CLDR only has round multiples of a quarter hour, and only some of + // those. For anything else, throw in the ID we would use for this offset + // (if we'd accept that ID). + QByteArray isoName = isoOffsetFormat(offsetSeconds, QTimeZone::ShortName).toUtf8(); + if (offsetFromUtcString(isoName) == qint64(offsetSeconds) && !result.contains(isoName)) + result << isoName; // Not guaranteed to be sorted, so sort: std::sort(result.begin(), result.end()); // ### assuming no duplicates