6#ifndef QTIMEZONEPRIVATE_P_H
7#define QTIMEZONEPRIVATE_P_H
22#include "private/qlocale_p.h"
23#include "private/qdatetime_p.h"
25#if QT_CONFIG(timezone_tzdb)
30#include <unicode/ucal.h>
38#include <qt_windows.h>
52 bool operator=(
const QTimeZonePrivate &)
const =
delete;
54 QTimeZonePrivate(
const QTimeZonePrivate &other) =
default;
59 qint64 atMSecsSinceEpoch;
61 int standardTimeOffset;
62 int daylightTimeOffset;
64 : atMSecsSinceEpoch(QTimeZonePrivate::invalidMSecs()),
65 offsetFromUtc(QTimeZonePrivate::invalidSeconds()),
66 standardTimeOffset(QTimeZonePrivate::invalidSeconds()),
67 daylightTimeOffset(QTimeZonePrivate::invalidSeconds())
69 Data(
const QString &name, qint64 when,
int offset,
int standard)
71 atMSecsSinceEpoch(when),
72 offsetFromUtc(offset),
73 standardTimeOffset(standard),
74 daylightTimeOffset(offset - standard)
77 typedef QList<Data> DataList;
81 virtual ~QTimeZonePrivate();
83 virtual QTimeZonePrivate *clone()
const = 0;
85 bool operator==(
const QTimeZonePrivate &other)
const;
86 bool operator!=(
const QTimeZonePrivate &other)
const;
90 QByteArray id()
const;
91 virtual QLocale::Territory territory()
const;
92 virtual QString comment()
const;
94 virtual QString displayName(qint64 atMSecsSinceEpoch,
95 QTimeZone::NameType nameType,
96 const QLocale &locale)
const;
97 virtual QString displayName(QTimeZone::TimeType timeType,
98 QTimeZone::NameType nameType,
99 const QLocale &locale)
const;
100 virtual QString abbreviation(qint64 atMSecsSinceEpoch)
const;
102 virtual int offsetFromUtc(qint64 atMSecsSinceEpoch)
const;
103 virtual int standardTimeOffset(qint64 atMSecsSinceEpoch)
const;
104 virtual int daylightTimeOffset(qint64 atMSecsSinceEpoch)
const;
106 virtual bool hasDaylightTime()
const;
107 virtual bool isDaylightTime(qint64 atMSecsSinceEpoch)
const;
109 virtual Data data(qint64 forMSecsSinceEpoch)
const;
110 virtual Data data(QTimeZone::TimeType timeType)
const;
111 virtual bool isDataLocale(
const QLocale &locale)
const;
112 QDateTimePrivate::ZoneState stateAtZoneTime(qint64 forLocalMSecs,
113 QDateTimePrivate::TransitionOptions resolve)
const;
115 virtual bool hasTransitions()
const;
116 virtual Data nextTransition(qint64 afterMSecsSinceEpoch)
const;
117 virtual Data previousTransition(qint64 beforeMSecsSinceEpoch)
const;
118 DataList transitions(qint64 fromMSecsSinceEpoch, qint64 toMSecsSinceEpoch)
const;
120 virtual QByteArray systemTimeZoneId()
const;
122 virtual bool isTimeZoneIdAvailable(
const QByteArray &ianaId)
const;
123 virtual QList<QByteArray> availableTimeZoneIds()
const = 0;
124 virtual QList<QByteArray> availableTimeZoneIds(QLocale::Territory territory)
const;
125 virtual QList<QByteArray> availableTimeZoneIds(
int utcOffset)
const;
127 virtual void serialize(QDataStream &ds)
const;
130 [[nodiscard]]
static constexpr qint64 maxMSecs()
131 {
return (std::numeric_limits<qint64>::max)(); }
132 [[nodiscard]]
static constexpr qint64 minMSecs()
133 {
return (std::numeric_limits<qint64>::min)() + 1; }
134 [[nodiscard]]
static constexpr qint64 invalidMSecs()
135 {
return (std::numeric_limits<qint64>::min)(); }
136 [[nodiscard]]
static constexpr int invalidSeconds()
137 {
return (std::numeric_limits<
int>::min)(); }
138 static QTimeZone::OffsetData invalidOffsetData();
139 static QTimeZone::OffsetData toOffsetData(
const Data &data);
140 static bool isValidId(
const QByteArray &ianaId);
141 static QString isoOffsetFormat(
int offsetFromUtc,
142 QTimeZone::NameType mode = QTimeZone::OffsetName);
144 static QByteArray aliasToIana(QByteArrayView alias);
145 static QByteArray ianaIdToWindowsId(
const QByteArray &ianaId);
146 static QByteArray windowsIdToDefaultIanaId(
const QByteArray &windowsId);
147 static QByteArray windowsIdToDefaultIanaId(
const QByteArray &windowsId,
148 QLocale::Territory territory);
149 static QList<QByteArray> windowsIdToIanaIds(
const QByteArray &windowsId);
150 static QList<QByteArray> windowsIdToIanaIds(
const QByteArray &windowsId,
151 QLocale::Territory territory);
154 [[nodiscard]]
static inline QString utcQString()
156 return QStringLiteral(
"UTC");
159 [[nodiscard]]
static inline QByteArray utcQByteArray()
161 return QByteArrayLiteral(
"UTC");
167 QList<QByteArrayView> matchingTimeZoneIds(QLocale::Territory territory)
const;
168 QList<QByteArrayView> matchingTimeZoneIds(
int utcOffset)
const;
170#if QT_CONFIG(timezone_locale)
172 QString localeName(qint64 atMSecsSinceEpoch,
int offsetFromUtc,
173 QTimeZone::TimeType timeType,
174 QTimeZone::NameType nameType,
175 const QLocale &locale)
const;
182template<> QTimeZonePrivate *QSharedDataPointer<QTimeZonePrivate>::clone();
184class Q_AUTOTEST_EXPORT QUtcTimeZonePrivate final :
public QTimeZonePrivate
186 bool operator=(
const QUtcTimeZonePrivate &)
const =
delete;
187 QUtcTimeZonePrivate(
const QUtcTimeZonePrivate &other);
190 QUtcTimeZonePrivate();
192 QUtcTimeZonePrivate(
const QByteArray &utcId);
194 QUtcTimeZonePrivate(qint32 offsetSeconds);
196 QUtcTimeZonePrivate(
const QByteArray &zoneId,
int offsetSeconds,
const QString &name,
197 const QString &abbreviation, QLocale::Territory territory,
198 const QString &comment);
199 virtual ~QUtcTimeZonePrivate();
202 static qint64 offsetFromUtcString(QByteArrayView id);
204 QUtcTimeZonePrivate *clone()
const override;
206 Data data(qint64 forMSecsSinceEpoch)
const override;
207 Data data(QTimeZone::TimeType timeType)
const override;
208 bool isDataLocale(
const QLocale &locale)
const override;
210 QLocale::Territory territory()
const override;
211 QString comment()
const override;
213 QString displayName(qint64 atMSecsSinceEpoch,
214 QTimeZone::NameType nameType,
215 const QLocale &locale)
const override;
216 QString displayName(QTimeZone::TimeType timeType,
217 QTimeZone::NameType nameType,
218 const QLocale &locale)
const override;
219 QString abbreviation(qint64 atMSecsSinceEpoch)
const override;
221 int standardTimeOffset(qint64 atMSecsSinceEpoch)
const override;
222 int daylightTimeOffset(qint64 atMSecsSinceEpoch)
const override;
224 QByteArray systemTimeZoneId()
const override;
226 bool isTimeZoneIdAvailable(
const QByteArray &ianaId)
const override;
227 QList<QByteArray> availableTimeZoneIds()
const override;
228 QList<QByteArray> availableTimeZoneIds(QLocale::Territory country)
const override;
229 QList<QByteArray> availableTimeZoneIds(
int utcOffset)
const override;
231 void serialize(QDataStream &ds)
const override;
234 void init(
const QByteArray &zoneId,
int offsetSeconds,
const QString &name,
235 const QString &abbreviation, QLocale::Territory territory,
236 const QString &comment);
239 QString m_abbreviation;
241 QLocale::Territory m_territory;
246#if QT_CONFIG(timezone_tzdb)
247class QChronoTimeZonePrivate final :
public QTimeZonePrivate
249 bool operator=(
const QChronoTimeZonePrivate &)
const =
delete;
250 QChronoTimeZonePrivate(
const QChronoTimeZonePrivate &) =
default;
252 QChronoTimeZonePrivate();
253 QChronoTimeZonePrivate(QByteArrayView id);
254 ~QChronoTimeZonePrivate() override;
255 QChronoTimeZonePrivate *clone()
const override;
257 QByteArray systemTimeZoneId()
const override;
259 QString abbreviation(qint64 atMSecsSinceEpoch)
const override;
260 int offsetFromUtc(qint64 atMSecsSinceEpoch)
const override;
261 int standardTimeOffset(qint64 atMSecsSinceEpoch)
const override;
262 int daylightTimeOffset(qint64 atMSecsSinceEpoch)
const override;
264 bool isTimeZoneIdAvailable(
const QByteArray &ianaId)
const override;
265 QList<QByteArray> availableTimeZoneIds()
const override;
266 QList<QByteArray> availableTimeZoneIds(
int utcOffset)
const override;
268 bool hasDaylightTime()
const override;
269 bool isDaylightTime(qint64 atMSecsSinceEpoch)
const override;
271 Data data(qint64 forMSecsSinceEpoch)
const override;
273 bool hasTransitions()
const override;
274 Data nextTransition(qint64 afterMSecsSinceEpoch)
const override;
275 Data previousTransition(qint64 beforeMSecsSinceEpoch)
const override;
278 const std::chrono::time_zone *
const m_timeZone;
280#elif defined(Q_OS_DARWIN)
281class Q_AUTOTEST_EXPORT QMacTimeZonePrivate final :
public QTimeZonePrivate
283 bool operator=(
const QMacTimeZonePrivate &)
const =
delete;
284 QMacTimeZonePrivate(
const QMacTimeZonePrivate &other);
287 QMacTimeZonePrivate();
289 QMacTimeZonePrivate(
const QByteArray &ianaId);
290 ~QMacTimeZonePrivate();
292 QMacTimeZonePrivate *clone()
const override;
294 QString comment()
const override;
296 using QTimeZonePrivate::displayName;
297 QString displayName(QTimeZone::TimeType timeType, QTimeZone::NameType nameType,
298 const QLocale &locale)
const override;
299 QString abbreviation(qint64 atMSecsSinceEpoch)
const override;
301 int offsetFromUtc(qint64 atMSecsSinceEpoch)
const override;
302 int standardTimeOffset(qint64 atMSecsSinceEpoch)
const override;
303 int daylightTimeOffset(qint64 atMSecsSinceEpoch)
const override;
305 bool hasDaylightTime()
const override;
306 bool isDaylightTime(qint64 atMSecsSinceEpoch)
const override;
308 using QTimeZonePrivate::data;
309 Data data(qint64 forMSecsSinceEpoch)
const override;
311 bool hasTransitions()
const override;
312 Data nextTransition(qint64 afterMSecsSinceEpoch)
const override;
313 Data previousTransition(qint64 beforeMSecsSinceEpoch)
const override;
315 QByteArray systemTimeZoneId()
const override;
316 bool isTimeZoneIdAvailable(
const QByteArray &ianaId)
const override;
317 QList<QByteArray> availableTimeZoneIds()
const override;
319 NSTimeZone *nsTimeZone()
const;
322 void init(
const QByteArray &zoneId);
326#elif defined(Q_OS_ANDROID)
327class QAndroidTimeZonePrivate final :
public QTimeZonePrivate
329 bool operator=(
const QAndroidTimeZonePrivate &)
const =
delete;
330 QAndroidTimeZonePrivate(
const QAndroidTimeZonePrivate &) =
default;
333 QAndroidTimeZonePrivate();
335 QAndroidTimeZonePrivate(
const QByteArray &ianaId);
336 ~QAndroidTimeZonePrivate();
338 QAndroidTimeZonePrivate *clone()
const override;
340 using QTimeZonePrivate::displayName;
341 QString displayName(QTimeZone::TimeType timeType, QTimeZone::NameType nameType,
342 const QLocale &locale)
const override;
343 QString abbreviation(qint64 atMSecsSinceEpoch)
const override;
345 int offsetFromUtc(qint64 atMSecsSinceEpoch)
const override;
346 int standardTimeOffset(qint64 atMSecsSinceEpoch)
const override;
347 int daylightTimeOffset(qint64 atMSecsSinceEpoch)
const override;
349 bool hasDaylightTime()
const override;
350 bool isDaylightTime(qint64 atMSecsSinceEpoch)
const override;
352 using QTimeZonePrivate::data;
353 Data data(qint64 forMSecsSinceEpoch)
const override;
355 QByteArray systemTimeZoneId()
const override;
356 bool isTimeZoneIdAvailable(
const QByteArray &ianaId)
const override;
357 QList<QByteArray> availableTimeZoneIds()
const override;
360 void init(
const QByteArray &zoneId);
362 QJniObject androidTimeZone;
364#elif defined(Q_OS_UNIX)
365struct QTzTransitionTime
367 qint64 atMSecsSinceEpoch;
370Q_DECLARE_TYPEINFO(QTzTransitionTime, Q_PRIMITIVE_TYPE);
371struct QTzTransitionRule
375 quint8 abbreviationIndex = 0;
377Q_DECLARE_TYPEINFO(QTzTransitionRule, Q_PRIMITIVE_TYPE);
378constexpr inline bool operator==(
const QTzTransitionRule &lhs,
const QTzTransitionRule &rhs)
noexcept
379{
return lhs.stdOffset == rhs.stdOffset && lhs.dstOffset == rhs.dstOffset && lhs.abbreviationIndex == rhs.abbreviationIndex; }
380constexpr inline bool operator!=(
const QTzTransitionRule &lhs,
const QTzTransitionRule &rhs)
noexcept
381{
return !operator==(lhs, rhs); }
385struct QTzTimeZoneCacheEntry
387 QList<QTzTransitionTime> m_tranTimes;
388 QList<QTzTransitionRule> m_tranRules;
389 QList<QByteArray> m_abbreviations;
390 QByteArray m_posixRule;
391 QTzTransitionRule m_preZoneRule;
392 bool m_hasDst =
false;
395class Q_AUTOTEST_EXPORT QTzTimeZonePrivate final :
public QTimeZonePrivate
397 bool operator=(
const QTzTimeZonePrivate &)
const =
delete;
398 QTzTimeZonePrivate(
const QTzTimeZonePrivate &) =
default;
401 QTzTimeZonePrivate();
403 QTzTimeZonePrivate(
const QByteArray &ianaId);
404 ~QTzTimeZonePrivate();
406 QTzTimeZonePrivate *clone()
const override;
408 QLocale::Territory territory()
const override;
409 QString comment()
const override;
411 using QTimeZonePrivate::displayName;
412 QString displayName(QTimeZone::TimeType timeType,
413 QTimeZone::NameType nameType,
414 const QLocale &locale)
const override;
415 QString abbreviation(qint64 atMSecsSinceEpoch)
const override;
417 int offsetFromUtc(qint64 atMSecsSinceEpoch)
const override;
418 int standardTimeOffset(qint64 atMSecsSinceEpoch)
const override;
419 int daylightTimeOffset(qint64 atMSecsSinceEpoch)
const override;
421 bool hasDaylightTime()
const override;
422 bool isDaylightTime(qint64 atMSecsSinceEpoch)
const override;
424 Data data(qint64 forMSecsSinceEpoch)
const override;
425 Data data(QTimeZone::TimeType timeType)
const override;
426 bool isDataLocale(
const QLocale &locale)
const override;
428 bool hasTransitions()
const override;
429 Data nextTransition(qint64 afterMSecsSinceEpoch)
const override;
430 Data previousTransition(qint64 beforeMSecsSinceEpoch)
const override;
432 QByteArray systemTimeZoneId()
const override;
434 bool isTimeZoneIdAvailable(
const QByteArray &ianaId)
const override;
435 QList<QByteArray> availableTimeZoneIds()
const override;
436 QList<QByteArray> availableTimeZoneIds(QLocale::Territory territory)
const override;
439 static QByteArray staticSystemTimeZoneId();
440 QList<QTimeZonePrivate::Data> getPosixTransitions(qint64 msNear)
const;
442 Data dataForTzTransition(QTzTransitionTime tran)
const;
443 Data dataFromRule(QTzTransitionRule rule, qint64 msecsSinceEpoch)
const;
444 QTzTimeZoneCacheEntry cached_data;
445 const QList<QTzTransitionTime> &tranCache()
const {
return cached_data.m_tranTimes; }
448class Q_AUTOTEST_EXPORT QIcuTimeZonePrivate final :
public QTimeZonePrivate
450 bool operator=(
const QIcuTimeZonePrivate &)
const =
delete;
451 QIcuTimeZonePrivate(
const QIcuTimeZonePrivate &other);
454 QIcuTimeZonePrivate();
456 QIcuTimeZonePrivate(
const QByteArray &ianaId);
457 ~QIcuTimeZonePrivate();
459 QIcuTimeZonePrivate *clone()
const override;
461 using QTimeZonePrivate::displayName;
462 QString displayName(QTimeZone::TimeType timeType, QTimeZone::NameType nameType,
463 const QLocale &locale)
const override;
465 int offsetFromUtc(qint64 atMSecsSinceEpoch)
const override;
466 int standardTimeOffset(qint64 atMSecsSinceEpoch)
const override;
467 int daylightTimeOffset(qint64 atMSecsSinceEpoch)
const override;
469 bool hasDaylightTime()
const override;
470 bool isDaylightTime(qint64 atMSecsSinceEpoch)
const override;
472 using QTimeZonePrivate::data;
473 Data data(qint64 forMSecsSinceEpoch)
const override;
475 bool hasTransitions()
const override;
476 Data nextTransition(qint64 afterMSecsSinceEpoch)
const override;
477 Data previousTransition(qint64 beforeMSecsSinceEpoch)
const override;
479 QByteArray systemTimeZoneId()
const override;
481 bool isTimeZoneIdAvailable(
const QByteArray &ianaId)
const override;
482 QList<QByteArray> availableTimeZoneIds()
const override;
483 QList<QByteArray> availableTimeZoneIds(QLocale::Territory territory)
const override;
484 QList<QByteArray> availableTimeZoneIds(
int offsetFromUtc)
const override;
487 void init(
const QByteArray &ianaId);
491#elif defined(Q_OS_WIN)
492class Q_AUTOTEST_EXPORT QWinTimeZonePrivate final :
public QTimeZonePrivate
494 bool operator=(
const QWinTimeZonePrivate &)
const =
delete;
495 QWinTimeZonePrivate(
const QWinTimeZonePrivate &) =
default;
497 struct QWinTransitionRule {
499 int standardTimeBias;
500 int daylightTimeBias;
501 SYSTEMTIME standardTimeRule;
502 SYSTEMTIME daylightTimeRule;
506 QWinTimeZonePrivate();
508 QWinTimeZonePrivate(
const QByteArray &ianaId);
509 ~QWinTimeZonePrivate();
511 QWinTimeZonePrivate *clone()
const override;
513 QString comment()
const override;
515 using QTimeZonePrivate::displayName;
516 QString displayName(QTimeZone::TimeType timeType, QTimeZone::NameType nameType,
517 const QLocale &locale)
const override;
518 QString abbreviation(qint64 atMSecsSinceEpoch)
const override;
520 int offsetFromUtc(qint64 atMSecsSinceEpoch)
const override;
521 int standardTimeOffset(qint64 atMSecsSinceEpoch)
const override;
522 int daylightTimeOffset(qint64 atMSecsSinceEpoch)
const override;
524 bool hasDaylightTime()
const override;
525 bool isDaylightTime(qint64 atMSecsSinceEpoch)
const override;
527 using QTimeZonePrivate::data;
528 Data data(qint64 forMSecsSinceEpoch)
const override;
530 bool hasTransitions()
const override;
531 Data nextTransition(qint64 afterMSecsSinceEpoch)
const override;
532 Data previousTransition(qint64 beforeMSecsSinceEpoch)
const override;
534 QByteArray systemTimeZoneId()
const override;
536 QList<QByteArray> availableTimeZoneIds()
const override;
539 QTimeZonePrivate::Data ruleToData(
const QWinTransitionRule &rule, qint64 atMSecsSinceEpoch,
540 QTimeZone::TimeType type,
bool fakeDst =
false)
const;
542 void init(
const QByteArray &ianaId);
544 QByteArray m_windowsId;
545 QString m_displayName;
546 QString m_standardName;
547 QString m_daylightName;
548 QList<QWinTransitionRule> m_tranRules;
static constexpr WindowsData windowsDataTable[]
static constexpr ZoneData zoneDataTable[]
QT_REQUIRE_CONFIG(animation)
Q_DECLARE_TYPEINFO(QObjectPrivate::ConnectionList, Q_RELOCATABLE_TYPE)
constexpr bool atLowerWindowsKey(WindowsData entry, qint16 winIdKey) noexcept
static bool earlierAliasId(AliasData entry, QByteArrayView aliasId) noexcept
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 QList< QByteArray > selectAvailable(QList< QByteArrayView > &&desired, const QList< QByteArray > &all)
static quint16 toWindowsIdKey(const QByteArray &winId)
static QByteArray 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