diff --git a/src/corelib/time/qtimezone.cpp b/src/corelib/time/qtimezone.cpp index 1da2e037c70..421c2d68786 100644 --- a/src/corelib/time/qtimezone.cpp +++ b/src/corelib/time/qtimezone.cpp @@ -1443,6 +1443,7 @@ QTimeZone QTimeZone::systemTimeZone() } /*! + \fn QTimeZone QTimeZone::utc() \since 5.5 Returns a QTimeZone object that describes UTC as a time zone. @@ -1453,11 +1454,20 @@ QTimeZone QTimeZone::systemTimeZone() \sa systemTimeZone(), Initialization, asBackendZone() */ -QTimeZone QTimeZone::utc() +QTimeZone QTimeZonePrivate::utcQTimeZone() { return QTimeZone(*new QUtcTimeZonePrivate()); } +Q_GLOBAL_STATIC(QTimeZone, utcTimeZone, QTimeZonePrivate::utcQTimeZone()); + +QTimeZone QTimeZone::utc() +{ + if (Q_UNLIKELY(utcTimeZone.isDestroyed())) + return QTimeZonePrivate::utcQTimeZone(); // create a new, unshared one + return *utcTimeZone; // take a shallow copy +} + /*! Returns \c true if a given time zone \a ianaId is available on this system. diff --git a/src/corelib/time/qtimezoneprivate_p.h b/src/corelib/time/qtimezoneprivate_p.h index d240beb2efa..b2c03e49f0a 100644 --- a/src/corelib/time/qtimezoneprivate_p.h +++ b/src/corelib/time/qtimezoneprivate_p.h @@ -161,6 +161,8 @@ public: return QByteArrayLiteral("UTC"); } + [[nodiscard]] static QTimeZone utcQTimeZone(); + protected: // Zones CLDR data says match a condition. // Use to filter what the backend has available.