From d9602efe8873083c7eb5171dc26b2ecdfa071841 Mon Sep 17 00:00:00 2001 From: Edward Welbourne Date: Wed, 23 Mar 2022 14:56:17 +0100 Subject: Fix QIcuTimeZonePrivate::hasDaylightTime() to catch historical DST MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit QTimeZone::hasDaylightTime() is documented to return true if a zone has ever dabbled in DST, but the ICU implementation was only detecting whether the zone currently engages in it. When the transitions API is available (currently for version == 50; will soon change to >= 50), use it to find out whether DST was ever in effect. Task-number: QTBUG-99747 Pick-to: 6.3 6.2 Change-Id: I4576de2e074dc57b54450b1e40a23358ccf0ef49 Reviewed-by: MÃ¥rten Nordheim --- src/corelib/time/qtimezoneprivate_icu.cpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/corelib/time/qtimezoneprivate_icu.cpp b/src/corelib/time/qtimezoneprivate_icu.cpp index b1de236fcb..1f07057168 100644 --- a/src/corelib/time/qtimezoneprivate_icu.cpp +++ b/src/corelib/time/qtimezoneprivate_icu.cpp @@ -386,8 +386,17 @@ int QIcuTimeZonePrivate::daylightTimeOffset(qint64 atMSecsSinceEpoch) const bool QIcuTimeZonePrivate::hasDaylightTime() const { - // TODO No direct ICU C api, work-around below not reliable? Find a better way? - return (ucalDaylightOffset(m_id) != 0); + if (ucalDaylightOffset(m_id) != 0) + return true; +#if U_ICU_VERSION_MAJOR_NUM == 50 + for (qint64 when = minMSecs(); when != invalidMSecs(); ) { + auto data = nextTransition(when); + if (data.daylightTimeOffset && data.daylightTimeOffset != invalidSeconds()) + return true; + when = data.atMSecsSinceEpoch; + } +#endif + return false; } bool QIcuTimeZonePrivate::isDaylightTime(qint64 atMSecsSinceEpoch) const -- cgit v1.2.3