Include offset-zone's ID in the available IDs for an offset

While it would be perverse for availableTimeZoneIds() to list all
supported UTC-offset zone IDs, it makes reasonably good sense for its
offset-specific overload to include the ID QTimeZone would use for the
relevant UTC-offset, since passing this ID to the ID-based constructor
will indeed get a zone with this offset. In particular, it already
does include the offset-zone's ID if there is an IANA UTC-offset zone
with the given offset; and its list is apt to be empty otherwise.

Only applies to IDs we would in fact accept, checked with
offsetFromUtcString() to match the QTZ constructor's check.

Change-Id: I77bb60b166c3d3af5824d84952e1e10a5d32a5ad
Reviewed-by: Paul Wicking <paul.wicking@qt.io>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
This commit is contained in:
Edward Welbourne 2023-10-27 18:57:00 +02:00
parent df73672f97
commit 905fb43594
2 changed files with 11 additions and 1 deletions

View File

@ -1504,9 +1504,13 @@ QList<QByteArray> QTimeZone::availableTimeZoneIds(QLocale::Territory territory)
Returns a list of all available IANA time zone IDs with a given standard Returns a list of all available IANA time zone IDs with a given standard
time offset of \a offsetSeconds. 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. This method is only available when feature \c timezone is enabled.
\sa isTimeZoneIdAvailable() \sa isTimeZoneIdAvailable(), QTimeZone(int)
*/ */
QList<QByteArray> QTimeZone::availableTimeZoneIds(int offsetSeconds) QList<QByteArray> QTimeZone::availableTimeZoneIds(int offsetSeconds)

View File

@ -989,6 +989,12 @@ QList<QByteArray> QUtcTimeZonePrivate::availableTimeZoneIds(qint32 offsetSeconds
} }
result << id.toByteArray(); 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: // Not guaranteed to be sorted, so sort:
std::sort(result.begin(), result.end()); std::sort(result.begin(), result.end());
// ### assuming no duplicates // ### assuming no duplicates