7#ifndef QTIMEZONEPRIVATE_P_H
8#define QTIMEZONEPRIVATE_P_H
23#include "private/qlocale_p.h"
24#include "private/qdatetime_p.h"
25#include "private/qttemporalpattern_p.h"
27#if QT_CONFIG(timezone_tzdb)
33#include <unicode/ucal.h>
37Q_FORWARD_DECLARE_OBJC_CLASS(NSTimeZone);
41#include <qt_windows.h>
55 QTimeZonePrivate &operator=(
const QTimeZonePrivate &)
const =
delete;
57 QTimeZonePrivate(
const QTimeZonePrivate &other) =
default;
62 qint64 atMSecsSinceEpoch;
64 int standardTimeOffset;
65 int daylightTimeOffset;
67 : atMSecsSinceEpoch(QTimeZonePrivate::invalidMSecs()),
68 offsetFromUtc(QTimeZonePrivate::invalidSeconds()),
69 standardTimeOffset(QTimeZonePrivate::invalidSeconds()),
70 daylightTimeOffset(QTimeZonePrivate::invalidSeconds())
72 Data(
const QString &name, qint64 when,
int offset,
int standard)
74 atMSecsSinceEpoch(when),
75 offsetFromUtc(offset),
76 standardTimeOffset(standard),
77 daylightTimeOffset(offset - standard)
80 typedef QList<Data> DataList;
84 virtual ~QTimeZonePrivate();
86 virtual QTimeZonePrivate *clone()
const = 0;
88 bool operator==(
const QTimeZonePrivate &other)
const;
89 bool operator!=(
const QTimeZonePrivate &other)
const;
93 QByteArray id()
const;
94 virtual QLocale::Territory territory()
const;
95 virtual QString comment()
const;
97 virtual QString displayName(qint64 atMSecsSinceEpoch,
98 QTimeZone::NameType nameType,
99 const QLocale &locale)
const;
100 virtual QString displayName(QTimeZone::TimeType timeType,
101 QTimeZone::NameType nameType,
102 const QLocale &locale)
const;
103 virtual QString abbreviation(qint64 atMSecsSinceEpoch)
const;
105 virtual int offsetFromUtc(qint64 atMSecsSinceEpoch)
const;
106 virtual int standardTimeOffset(qint64 atMSecsSinceEpoch)
const;
107 virtual int daylightTimeOffset(qint64 atMSecsSinceEpoch)
const;
109 virtual bool hasDaylightTime()
const;
110 virtual bool isDaylightTime(qint64 atMSecsSinceEpoch)
const;
112 virtual Data data(qint64 forMSecsSinceEpoch)
const;
113 virtual Data data(QTimeZone::TimeType timeType)
const;
114 virtual bool isDataLocale(
const QLocale &locale)
const;
115 static bool isAnglicLocale(
const QLocale &locale)
118 const QLocale::Language lang = locale.language();
119 return lang == QLocale::C
120 || (lang == QLocale::English && locale.script() == QLocale::LatinScript);
122 QDateTimePrivate::ZoneState stateAtZoneTime(qint64 forLocalMSecs,
123 QDateTimePrivate::TransitionOptions resolve)
const;
125 virtual bool hasTransitions()
const;
126 virtual Data nextTransition(qint64 afterMSecsSinceEpoch)
const;
127 virtual Data previousTransition(qint64 beforeMSecsSinceEpoch)
const;
128 DataList transitions(qint64 fromMSecsSinceEpoch, qint64 toMSecsSinceEpoch)
const;
130 virtual QByteArray systemTimeZoneId()
const;
132 QByteArrayView availableAlias(QByteArrayView ianaId)
const;
133 virtual bool isTimeZoneIdAvailable(QByteArrayView ianaId)
const;
134 virtual QList<QByteArray> availableTimeZoneIds()
const = 0;
135 virtual QList<QByteArray> availableTimeZoneIds(QLocale::Territory territory)
const;
136 virtual QList<QByteArray> availableTimeZoneIds(
int utcOffset)
const;
138 virtual void serialize(QDataStream &ds)
const;
141 [[nodiscard]]
static constexpr qint64 maxMSecs()
142 {
return (std::numeric_limits<qint64>::max)(); }
143 [[nodiscard]]
static constexpr qint64 minMSecs()
144 {
return (std::numeric_limits<qint64>::min)() + 1; }
145 [[nodiscard]]
static constexpr qint64 invalidMSecs()
146 {
return (std::numeric_limits<qint64>::min)(); }
147 [[nodiscard]]
static constexpr int invalidSeconds()
148 {
return (std::numeric_limits<
int>::min)(); }
149 static QTimeZone::OffsetData invalidOffsetData();
150 static QTimeZone::OffsetData toOffsetData(
const Data &data);
151 static bool isValidId(QByteArrayView ianaId);
152 static QString isoOffsetFormat(
int offsetFromUtc,
153 QTimeZone::NameType mode = QTimeZone::OffsetName);
155 static QByteArrayView aliasToIana(QByteArrayView alias);
156 static QByteArrayView ianaIdToWindowsId(QByteArrayView ianaId);
157 static QByteArrayView windowsIdToDefaultIanaId(QByteArrayView windowsId);
158 static QByteArrayView windowsIdToDefaultIanaId(QByteArrayView windowsId,
159 QLocale::Territory territory);
160 static QList<QByteArray> windowsIdToIanaIds(QByteArrayView windowsId);
161 static QList<QByteArray> windowsIdToIanaIds(QByteArrayView windowsId,
162 QLocale::Territory territory);
163 struct NamePrefixMatch
166 qsizetype nameLength = 0;
167 QTimeZone::TimeType timeType = QTimeZone::GenericTime;
168 std::optional<
int> offset = {};
169 operator
bool()
const {
return nameLength > 0; }
171 static NamePrefixMatch findLongNamePrefix(QStringView text,
const QLocale &locale,
172 std::optional<qint64> atEpochMillis = std::nullopt);
173 static NamePrefixMatch findNarrowOffsetPrefix(QStringView text,
const QLocale &locale);
176 static NamePrefixMatch findOffsetPrefix(QStringView text,
const QLocale &locale,
177 QtTemporalPattern::TemporalFieldFlags flags = {});
179 static NamePrefixMatch findLongUtcPrefix(QStringView text);
180 static QList<QByteArray> getCanonicalZonesThenAliases();
183 [[nodiscard]]
static inline QString utcQString()
185 return QStringLiteral(
"UTC");
188 [[nodiscard]]
static inline QByteArray utcQByteArray()
190 return QByteArrayLiteral(
"UTC");
193 [[nodiscard]]
static QTimeZone utcQTimeZone();
195#ifdef QT_BUILD_INTERNAL
196 [[nodiscard]]
static inline const QTimeZonePrivate *extractPrivate(
const QTimeZone &zone)
198 return zone.d.operator->();
205 QList<QByteArrayView> matchingTimeZoneIds(QLocale::Territory territory)
const;
206 QList<QByteArrayView> matchingTimeZoneIds(
int utcOffset)
const;
208 static QList<QByteArray> uniqueSortedAliasPadded(QList<QByteArray> &&zoneIds);
209 static QList<QByteArray> padSortedWithAliases(QList<QByteArray> &&zoneIds);
211#if QT_CONFIG(timezone_locale)
213 QString localeName(qint64 atMSecsSinceEpoch,
int offsetFromUtc,
214 QTimeZone::TimeType timeType,
215 QTimeZone::NameType nameType,
216 const QLocale &locale)
const;
223class Q_AUTOTEST_EXPORT QUtcTimeZonePrivate final :
public QTimeZonePrivate
225 QUtcTimeZonePrivate &operator=(
const QUtcTimeZonePrivate &)
const =
delete;
226 QUtcTimeZonePrivate(
const QUtcTimeZonePrivate &other);
229 QUtcTimeZonePrivate();
231 QUtcTimeZonePrivate(
const QByteArray &utcId);
233 QUtcTimeZonePrivate(qint32 offsetSeconds);
235 QUtcTimeZonePrivate(
const QByteArray &zoneId,
int offsetSeconds,
const QString &name,
236 const QString &abbreviation, QLocale::Territory territory,
237 const QString &comment);
238 virtual ~QUtcTimeZonePrivate();
241 static qint64 offsetFromUtcString(QByteArrayView id);
243 QUtcTimeZonePrivate *clone()
const override;
245 Data data(qint64 forMSecsSinceEpoch)
const override;
246 Data data(QTimeZone::TimeType timeType)
const override;
247 bool isDataLocale(
const QLocale &locale)
const override;
249 QLocale::Territory territory()
const override;
250 QString comment()
const override;
252 QString displayName(qint64 atMSecsSinceEpoch,
253 QTimeZone::NameType nameType,
254 const QLocale &locale)
const override;
255 QString displayName(QTimeZone::TimeType timeType,
256 QTimeZone::NameType nameType,
257 const QLocale &locale)
const override;
258 QString abbreviation(qint64 atMSecsSinceEpoch)
const override;
260 int standardTimeOffset(qint64 atMSecsSinceEpoch)
const override;
261 int daylightTimeOffset(qint64 atMSecsSinceEpoch)
const override;
263 QByteArray systemTimeZoneId()
const override;
265 bool isTimeZoneIdAvailable(QByteArrayView ianaId)
const override;
266 QList<QByteArray> availableTimeZoneIds()
const override;
267 QList<QByteArray> availableTimeZoneIds(QLocale::Territory country)
const override;
268 QList<QByteArray> availableTimeZoneIds(
int utcOffset)
const override;
270 void serialize(QDataStream &ds)
const override;
273 void init(
const QByteArray &zoneId,
int offsetSeconds,
const QString &name,
274 const QString &abbreviation, QLocale::Territory territory,
275 const QString &comment);
278 QString m_abbreviation;
280 QLocale::Territory m_territory;
285#if QT_CONFIG(timezone_tzdb)
286class QChronoTimeZonePrivate final :
public QTimeZonePrivate
288 QChronoTimeZonePrivate &operator=(
const QChronoTimeZonePrivate &)
const =
delete;
289 QChronoTimeZonePrivate(
const QChronoTimeZonePrivate &) =
default;
291 QChronoTimeZonePrivate();
292 QChronoTimeZonePrivate(QByteArrayView id);
293 ~QChronoTimeZonePrivate() override;
294 QChronoTimeZonePrivate *clone()
const override;
296 QByteArray systemTimeZoneId()
const override;
298 QString abbreviation(qint64 atMSecsSinceEpoch)
const override;
299 int offsetFromUtc(qint64 atMSecsSinceEpoch)
const override;
300 int standardTimeOffset(qint64 atMSecsSinceEpoch)
const override;
301 int daylightTimeOffset(qint64 atMSecsSinceEpoch)
const override;
303 bool isTimeZoneIdAvailable(QByteArrayView ianaId)
const override;
304 QList<QByteArray> availableTimeZoneIds()
const override;
305 QList<QByteArray> availableTimeZoneIds(
int utcOffset)
const override;
307 bool hasDaylightTime()
const override;
308 bool isDaylightTime(qint64 atMSecsSinceEpoch)
const override;
310 Data data(qint64 forMSecsSinceEpoch)
const override;
312 bool hasTransitions()
const override;
313 Data nextTransition(qint64 afterMSecsSinceEpoch)
const override;
314 Data previousTransition(qint64 beforeMSecsSinceEpoch)
const override;
317 const std::chrono::time_zone *
const m_timeZone;
319#elif defined(Q_OS_DARWIN)
320class Q_AUTOTEST_EXPORT QMacTimeZonePrivate final :
public QTimeZonePrivate
322 QMacTimeZonePrivate &operator=(
const QMacTimeZonePrivate &)
const =
delete;
323 QMacTimeZonePrivate(
const QMacTimeZonePrivate &other);
326 QMacTimeZonePrivate();
328 QMacTimeZonePrivate(
const QByteArray &ianaId);
329 ~QMacTimeZonePrivate();
331 QMacTimeZonePrivate *clone()
const override;
333 QString comment()
const override;
335 using QTimeZonePrivate::displayName;
336 QString displayName(QTimeZone::TimeType timeType, QTimeZone::NameType nameType,
337 const QLocale &locale)
const override;
338 QString abbreviation(qint64 atMSecsSinceEpoch)
const override;
340 int offsetFromUtc(qint64 atMSecsSinceEpoch)
const override;
341 int standardTimeOffset(qint64 atMSecsSinceEpoch)
const override;
342 int daylightTimeOffset(qint64 atMSecsSinceEpoch)
const override;
344 bool hasDaylightTime()
const override;
345 bool isDaylightTime(qint64 atMSecsSinceEpoch)
const override;
347 using QTimeZonePrivate::data;
348 Data data(qint64 forMSecsSinceEpoch)
const override;
350 bool hasTransitions()
const override;
351 Data nextTransition(qint64 afterMSecsSinceEpoch)
const override;
352 Data previousTransition(qint64 beforeMSecsSinceEpoch)
const override;
354 QByteArray systemTimeZoneId()
const override;
355 bool isTimeZoneIdAvailable(QByteArrayView ianaId)
const override;
356 QList<QByteArray> availableTimeZoneIds()
const override;
358 NSTimeZone *nsTimeZone()
const;
361 void init(
const QByteArray &zoneId);
365#elif defined(Q_OS_ANDROID)
366class QAndroidTimeZonePrivate final :
public QTimeZonePrivate
368 QAndroidTimeZonePrivate &operator=(
const QAndroidTimeZonePrivate &)
const =
delete;
369 QAndroidTimeZonePrivate(
const QAndroidTimeZonePrivate &) =
default;
372 QAndroidTimeZonePrivate();
374 QAndroidTimeZonePrivate(QByteArrayView ianaId);
375 ~QAndroidTimeZonePrivate();
377 QAndroidTimeZonePrivate *clone()
const override;
379 using QTimeZonePrivate::displayName;
380 QString displayName(QTimeZone::TimeType timeType, QTimeZone::NameType nameType,
381 const QLocale &locale)
const override;
382 QString abbreviation(qint64 atMSecsSinceEpoch)
const override;
384 int offsetFromUtc(qint64 atMSecsSinceEpoch)
const override;
385 int standardTimeOffset(qint64 atMSecsSinceEpoch)
const override;
386 int daylightTimeOffset(qint64 atMSecsSinceEpoch)
const override;
388 bool hasDaylightTime()
const override;
389 bool isDaylightTime(qint64 atMSecsSinceEpoch)
const override;
391 using QTimeZonePrivate::data;
392 Data data(qint64 forMSecsSinceEpoch)
const override;
394 QByteArray systemTimeZoneId()
const override;
395 bool isTimeZoneIdAvailable(QByteArrayView ianaId)
const override;
396 QList<QByteArray> availableTimeZoneIds()
const override;
399 void init(QByteArrayView zoneId);
401 QJniObject androidTimeZone;
403#elif defined(Q_OS_UNIX) && !defined(Q_OS_VXWORKS) && !defined(Q_OS_WASM) && !defined(Q_OS_HARMONY)
404struct QTzTransitionTime
406 qint64 atMSecsSinceEpoch;
409Q_DECLARE_TYPEINFO(QTzTransitionTime, Q_PRIMITIVE_TYPE);
410struct QTzTransitionRule
414 quint8 abbreviationIndex = 0;
416Q_DECLARE_TYPEINFO(QTzTransitionRule, Q_PRIMITIVE_TYPE);
417constexpr inline bool operator==(
const QTzTransitionRule &lhs,
const QTzTransitionRule &rhs)
noexcept
418{
return lhs.stdOffset == rhs.stdOffset && lhs.dstOffset == rhs.dstOffset && lhs.abbreviationIndex == rhs.abbreviationIndex; }
419constexpr inline bool operator!=(
const QTzTransitionRule &lhs,
const QTzTransitionRule &rhs)
noexcept
420{
return !operator==(lhs, rhs); }
424struct QTzTimeZoneCacheEntry
426 QList<QTzTransitionTime> m_tranTimes;
427 QList<QTzTransitionRule> m_tranRules;
428 QList<QByteArray> m_abbreviations;
429 QByteArray m_posixRule;
430 QTzTransitionRule m_preZoneRule;
431 bool m_hasDst =
false;
434class Q_AUTOTEST_EXPORT QTzTimeZonePrivate final :
public QTimeZonePrivate
436 QTzTimeZonePrivate &operator=(
const QTzTimeZonePrivate &)
const =
delete;
437 QTzTimeZonePrivate(
const QTzTimeZonePrivate &) =
default;
440 QTzTimeZonePrivate();
442 QTzTimeZonePrivate(
const QByteArray &ianaId);
443 ~QTzTimeZonePrivate();
445 QTzTimeZonePrivate *clone()
const override;
447 QLocale::Territory territory()
const override;
448 QString comment()
const override;
450 using QTimeZonePrivate::displayName;
451 QString displayName(QTimeZone::TimeType timeType,
452 QTimeZone::NameType nameType,
453 const QLocale &locale)
const override;
454 QString abbreviation(qint64 atMSecsSinceEpoch)
const override;
456 int offsetFromUtc(qint64 atMSecsSinceEpoch)
const override;
457 int standardTimeOffset(qint64 atMSecsSinceEpoch)
const override;
458 int daylightTimeOffset(qint64 atMSecsSinceEpoch)
const override;
460 bool hasDaylightTime()
const override;
461 bool isDaylightTime(qint64 atMSecsSinceEpoch)
const override;
463 Data data(qint64 forMSecsSinceEpoch)
const override;
464 Data data(QTimeZone::TimeType timeType)
const override;
465 bool isDataLocale(
const QLocale &locale)
const override;
467 bool hasTransitions()
const override;
468 Data nextTransition(qint64 afterMSecsSinceEpoch)
const override;
469 Data previousTransition(qint64 beforeMSecsSinceEpoch)
const override;
471 QByteArray systemTimeZoneId()
const override;
473 bool isTimeZoneIdAvailable(QByteArrayView ianaId)
const override;
474 QList<QByteArray> availableTimeZoneIds()
const override;
475 QList<QByteArray> availableTimeZoneIds(QLocale::Territory territory)
const override;
478 static QByteArray staticSystemTimeZoneId();
479 QList<QTimeZonePrivate::Data> getPosixTransitions(qint64 msNear)
const;
481 Data dataForTzTransition(QTzTransitionTime tran)
const;
482 Data dataFromRule(QTzTransitionRule rule, qint64 msecsSinceEpoch)
const;
483 QTzTimeZoneCacheEntry cached_data;
484 const QList<QTzTransitionTime> &tranCache()
const {
return cached_data.m_tranTimes; }
487class Q_AUTOTEST_EXPORT QIcuTimeZonePrivate final :
public QTimeZonePrivate
489 QIcuTimeZonePrivate &operator=(
const QIcuTimeZonePrivate &)
const =
delete;
490 QIcuTimeZonePrivate(
const QIcuTimeZonePrivate &other);
493 QIcuTimeZonePrivate();
495 QIcuTimeZonePrivate(
const QByteArray &ianaId);
496 ~QIcuTimeZonePrivate();
498 QIcuTimeZonePrivate *clone()
const override;
500 using QTimeZonePrivate::displayName;
501 QString displayName(QTimeZone::TimeType timeType, QTimeZone::NameType nameType,
502 const QLocale &locale)
const override;
504 int offsetFromUtc(qint64 atMSecsSinceEpoch)
const override;
505 int standardTimeOffset(qint64 atMSecsSinceEpoch)
const override;
506 int daylightTimeOffset(qint64 atMSecsSinceEpoch)
const override;
508 bool hasDaylightTime()
const override;
509 bool isDaylightTime(qint64 atMSecsSinceEpoch)
const override;
511 using QTimeZonePrivate::data;
512 Data data(qint64 forMSecsSinceEpoch)
const override;
514 bool hasTransitions()
const override;
515 Data nextTransition(qint64 afterMSecsSinceEpoch)
const override;
516 Data previousTransition(qint64 beforeMSecsSinceEpoch)
const override;
518 QByteArray systemTimeZoneId()
const override;
520 bool isTimeZoneIdAvailable(QByteArrayView ianaId)
const override;
521 QList<QByteArray> availableTimeZoneIds()
const override;
522 QList<QByteArray> availableTimeZoneIds(QLocale::Territory territory)
const override;
523 QList<QByteArray> availableTimeZoneIds(
int offsetFromUtc)
const override;
526 void init(
const QByteArray &ianaId);
530#elif defined(Q_OS_WIN)
531class Q_AUTOTEST_EXPORT QWinTimeZonePrivate final :
public QTimeZonePrivate
533 QWinTimeZonePrivate &operator=(
const QWinTimeZonePrivate &)
const =
delete;
534 QWinTimeZonePrivate(
const QWinTimeZonePrivate &) =
default;
536 struct QWinTransitionRule {
538 int standardTimeBias;
539 int daylightTimeBias;
540 SYSTEMTIME standardTimeRule;
541 SYSTEMTIME daylightTimeRule;
545 QWinTimeZonePrivate();
547 QWinTimeZonePrivate(
const QByteArray &ianaId);
548 ~QWinTimeZonePrivate();
550 QWinTimeZonePrivate *clone()
const override;
552 QString comment()
const override;
554 using QTimeZonePrivate::displayName;
555 QString displayName(QTimeZone::TimeType timeType, QTimeZone::NameType nameType,
556 const QLocale &locale)
const override;
557 QString abbreviation(qint64 atMSecsSinceEpoch)
const override;
559 int offsetFromUtc(qint64 atMSecsSinceEpoch)
const override;
560 int standardTimeOffset(qint64 atMSecsSinceEpoch)
const override;
561 int daylightTimeOffset(qint64 atMSecsSinceEpoch)
const override;
563 bool hasDaylightTime()
const override;
564 bool isDaylightTime(qint64 atMSecsSinceEpoch)
const override;
566 using QTimeZonePrivate::data;
567 Data data(qint64 forMSecsSinceEpoch)
const override;
569 bool hasTransitions()
const override;
570 Data nextTransition(qint64 afterMSecsSinceEpoch)
const override;
571 Data previousTransition(qint64 beforeMSecsSinceEpoch)
const override;
573 QByteArray systemTimeZoneId()
const override;
575 QList<QByteArray> availableTimeZoneIds()
const override;
578 QTimeZonePrivate::Data ruleToData(
const QWinTransitionRule &rule, qint64 atMSecsSinceEpoch,
579 QTimeZone::TimeType type,
bool fakeDst =
false)
const;
581 void init(
const QByteArray &ianaId);
583 QByteArray m_windowsId;
584 QString m_displayName;
585 QString m_standardName;
586 QString m_daylightName;
587 QList<QWinTransitionRule> m_tranRules;
static constexpr WindowsData windowsDataTable[]
static constexpr ZoneData zoneDataTable[]
static constexpr AliasData aliasMappingTable[]
Q_DECLARE_TYPEINFO(QDateTime::Data, Q_RELOCATABLE_TYPE)
#define QStringLiteral(str)
constexpr bool atLowerWindowsKey(WindowsData entry, qint16 winIdKey) noexcept
static bool earlierAliasId(AliasData entry, QByteArrayView aliasId) noexcept
static QByteArrayView aliasMatching(QByteArrayView name, Pred test)
static bool isEntryInIanaList(QByteArrayView id, QByteArrayView ianaIds)
static bool earlierWinData(WindowsData less, WindowsData more) noexcept
static auto zoneStartForWindowsId(quint16 windowsIdKey) noexcept
constexpr bool zoneAtLowerWindowsKey(ZoneData entry, qint16 winIdKey) noexcept
static quint16 toWindowsIdKey(QByteArrayView winId)
static QList< QByteArray > selectAvailable(QList< QByteArrayView > &&desired, const QList< QByteArray > &all)
static QByteArrayView toWindowsIdLiteral(quint16 windowsIdKey)
constexpr bool atLowerUtcOffset(UtcData entry, qint32 offsetSeconds) noexcept
constexpr bool earlierZoneData(ZoneData less, ZoneData more) noexcept
static bool earlierWindowsId(WindowsData entry, QByteArrayView winId) noexcept
QT_REQUIRE_CONFIG(timezone)