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 operator
bool()
const {
return nameLength > 0; }
170 static NamePrefixMatch findLongNamePrefix(QStringView text,
const QLocale &locale,
171 std::optional<qint64> atEpochMillis = std::nullopt);
172 static NamePrefixMatch findNarrowOffsetPrefix(QStringView text,
const QLocale &locale);
175 static NamePrefixMatch findOffsetPrefix(QStringView text,
const QLocale &locale,
176 QtTemporalPattern::TemporalFieldFlags flags = {});
178 static NamePrefixMatch findLongUtcPrefix(QStringView text);
179 static QList<QByteArray> getCanonicalZonesThenAliases();
182 [[nodiscard]]
static inline QString utcQString()
184 return QStringLiteral(
"UTC");
187 [[nodiscard]]
static inline QByteArray utcQByteArray()
189 return QByteArrayLiteral(
"UTC");
192 [[nodiscard]]
static QTimeZone utcQTimeZone();
194#ifdef QT_BUILD_INTERNAL
195 [[nodiscard]]
static inline const QTimeZonePrivate *extractPrivate(
const QTimeZone &zone)
197 return zone.d.operator->();
204 QList<QByteArrayView> matchingTimeZoneIds(QLocale::Territory territory)
const;
205 QList<QByteArrayView> matchingTimeZoneIds(
int utcOffset)
const;
207 static QList<QByteArray> uniqueSortedAliasPadded(QList<QByteArray> &&zoneIds);
208 static QList<QByteArray> padSortedWithAliases(QList<QByteArray> &&zoneIds);
210#if QT_CONFIG(timezone_locale)
212 QString localeName(qint64 atMSecsSinceEpoch,
int offsetFromUtc,
213 QTimeZone::TimeType timeType,
214 QTimeZone::NameType nameType,
215 const QLocale &locale)
const;
222class Q_AUTOTEST_EXPORT QUtcTimeZonePrivate final :
public QTimeZonePrivate
224 QUtcTimeZonePrivate &operator=(
const QUtcTimeZonePrivate &)
const =
delete;
225 QUtcTimeZonePrivate(
const QUtcTimeZonePrivate &other);
228 QUtcTimeZonePrivate();
230 QUtcTimeZonePrivate(
const QByteArray &utcId);
232 QUtcTimeZonePrivate(qint32 offsetSeconds);
234 QUtcTimeZonePrivate(
const QByteArray &zoneId,
int offsetSeconds,
const QString &name,
235 const QString &abbreviation, QLocale::Territory territory,
236 const QString &comment);
237 virtual ~QUtcTimeZonePrivate();
240 static qint64 offsetFromUtcString(QByteArrayView id);
242 QUtcTimeZonePrivate *clone()
const override;
244 Data data(qint64 forMSecsSinceEpoch)
const override;
245 Data data(QTimeZone::TimeType timeType)
const override;
246 bool isDataLocale(
const QLocale &locale)
const override;
248 QLocale::Territory territory()
const override;
249 QString comment()
const override;
251 QString displayName(qint64 atMSecsSinceEpoch,
252 QTimeZone::NameType nameType,
253 const QLocale &locale)
const override;
254 QString displayName(QTimeZone::TimeType timeType,
255 QTimeZone::NameType nameType,
256 const QLocale &locale)
const override;
257 QString abbreviation(qint64 atMSecsSinceEpoch)
const override;
259 int standardTimeOffset(qint64 atMSecsSinceEpoch)
const override;
260 int daylightTimeOffset(qint64 atMSecsSinceEpoch)
const override;
262 QByteArray systemTimeZoneId()
const override;
264 bool isTimeZoneIdAvailable(QByteArrayView ianaId)
const override;
265 QList<QByteArray> availableTimeZoneIds()
const override;
266 QList<QByteArray> availableTimeZoneIds(QLocale::Territory country)
const override;
267 QList<QByteArray> availableTimeZoneIds(
int utcOffset)
const override;
269 void serialize(QDataStream &ds)
const override;
272 void init(
const QByteArray &zoneId,
int offsetSeconds,
const QString &name,
273 const QString &abbreviation, QLocale::Territory territory,
274 const QString &comment);
277 QString m_abbreviation;
279 QLocale::Territory m_territory;
284#if QT_CONFIG(timezone_tzdb)
285class QChronoTimeZonePrivate final :
public QTimeZonePrivate
287 QChronoTimeZonePrivate &operator=(
const QChronoTimeZonePrivate &)
const =
delete;
288 QChronoTimeZonePrivate(
const QChronoTimeZonePrivate &) =
default;
290 QChronoTimeZonePrivate();
291 QChronoTimeZonePrivate(QByteArrayView id);
292 ~QChronoTimeZonePrivate() override;
293 QChronoTimeZonePrivate *clone()
const override;
295 QByteArray systemTimeZoneId()
const override;
297 QString abbreviation(qint64 atMSecsSinceEpoch)
const override;
298 int offsetFromUtc(qint64 atMSecsSinceEpoch)
const override;
299 int standardTimeOffset(qint64 atMSecsSinceEpoch)
const override;
300 int daylightTimeOffset(qint64 atMSecsSinceEpoch)
const override;
302 bool isTimeZoneIdAvailable(QByteArrayView ianaId)
const override;
303 QList<QByteArray> availableTimeZoneIds()
const override;
304 QList<QByteArray> availableTimeZoneIds(
int utcOffset)
const override;
306 bool hasDaylightTime()
const override;
307 bool isDaylightTime(qint64 atMSecsSinceEpoch)
const override;
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;
316 const std::chrono::time_zone *
const m_timeZone;
318#elif defined(Q_OS_DARWIN)
319class Q_AUTOTEST_EXPORT QMacTimeZonePrivate final :
public QTimeZonePrivate
321 QMacTimeZonePrivate &operator=(
const QMacTimeZonePrivate &)
const =
delete;
322 QMacTimeZonePrivate(
const QMacTimeZonePrivate &other);
325 QMacTimeZonePrivate();
327 QMacTimeZonePrivate(
const QByteArray &ianaId);
328 ~QMacTimeZonePrivate();
330 QMacTimeZonePrivate *clone()
const override;
332 QString comment()
const override;
334 using QTimeZonePrivate::displayName;
335 QString displayName(QTimeZone::TimeType timeType, QTimeZone::NameType nameType,
336 const QLocale &locale)
const override;
337 QString abbreviation(qint64 atMSecsSinceEpoch)
const override;
339 int offsetFromUtc(qint64 atMSecsSinceEpoch)
const override;
340 int standardTimeOffset(qint64 atMSecsSinceEpoch)
const override;
341 int daylightTimeOffset(qint64 atMSecsSinceEpoch)
const override;
343 bool hasDaylightTime()
const override;
344 bool isDaylightTime(qint64 atMSecsSinceEpoch)
const override;
346 using QTimeZonePrivate::data;
347 Data data(qint64 forMSecsSinceEpoch)
const override;
349 bool hasTransitions()
const override;
350 Data nextTransition(qint64 afterMSecsSinceEpoch)
const override;
351 Data previousTransition(qint64 beforeMSecsSinceEpoch)
const override;
353 QByteArray systemTimeZoneId()
const override;
354 bool isTimeZoneIdAvailable(QByteArrayView ianaId)
const override;
355 QList<QByteArray> availableTimeZoneIds()
const override;
357 NSTimeZone *nsTimeZone()
const;
360 void init(
const QByteArray &zoneId);
364#elif defined(Q_OS_ANDROID)
365class QAndroidTimeZonePrivate final :
public QTimeZonePrivate
367 QAndroidTimeZonePrivate &operator=(
const QAndroidTimeZonePrivate &)
const =
delete;
368 QAndroidTimeZonePrivate(
const QAndroidTimeZonePrivate &) =
default;
371 QAndroidTimeZonePrivate();
373 QAndroidTimeZonePrivate(QByteArrayView ianaId);
374 ~QAndroidTimeZonePrivate();
376 QAndroidTimeZonePrivate *clone()
const override;
378 using QTimeZonePrivate::displayName;
379 QString displayName(QTimeZone::TimeType timeType, QTimeZone::NameType nameType,
380 const QLocale &locale)
const override;
381 QString abbreviation(qint64 atMSecsSinceEpoch)
const override;
383 int offsetFromUtc(qint64 atMSecsSinceEpoch)
const override;
384 int standardTimeOffset(qint64 atMSecsSinceEpoch)
const override;
385 int daylightTimeOffset(qint64 atMSecsSinceEpoch)
const override;
387 bool hasDaylightTime()
const override;
388 bool isDaylightTime(qint64 atMSecsSinceEpoch)
const override;
390 using QTimeZonePrivate::data;
391 Data data(qint64 forMSecsSinceEpoch)
const override;
393 QByteArray systemTimeZoneId()
const override;
394 bool isTimeZoneIdAvailable(QByteArrayView ianaId)
const override;
395 QList<QByteArray> availableTimeZoneIds()
const override;
398 void init(QByteArrayView zoneId);
400 QJniObject androidTimeZone;
402#elif defined(Q_OS_UNIX) && !defined(Q_OS_VXWORKS) && !defined(Q_OS_WASM) && !defined(Q_OS_HARMONY)
403struct QTzTransitionTime
405 qint64 atMSecsSinceEpoch;
408Q_DECLARE_TYPEINFO(QTzTransitionTime, Q_PRIMITIVE_TYPE);
409struct QTzTransitionRule
413 quint8 abbreviationIndex = 0;
415Q_DECLARE_TYPEINFO(QTzTransitionRule, Q_PRIMITIVE_TYPE);
416constexpr inline bool operator==(
const QTzTransitionRule &lhs,
const QTzTransitionRule &rhs)
noexcept
417{
return lhs.stdOffset == rhs.stdOffset && lhs.dstOffset == rhs.dstOffset && lhs.abbreviationIndex == rhs.abbreviationIndex; }
418constexpr inline bool operator!=(
const QTzTransitionRule &lhs,
const QTzTransitionRule &rhs)
noexcept
419{
return !operator==(lhs, rhs); }
423struct QTzTimeZoneCacheEntry
425 QList<QTzTransitionTime> m_tranTimes;
426 QList<QTzTransitionRule> m_tranRules;
427 QList<QByteArray> m_abbreviations;
428 QByteArray m_posixRule;
429 QTzTransitionRule m_preZoneRule;
430 bool m_hasDst =
false;
433class Q_AUTOTEST_EXPORT QTzTimeZonePrivate final :
public QTimeZonePrivate
435 QTzTimeZonePrivate &operator=(
const QTzTimeZonePrivate &)
const =
delete;
436 QTzTimeZonePrivate(
const QTzTimeZonePrivate &) =
default;
439 QTzTimeZonePrivate();
441 QTzTimeZonePrivate(
const QByteArray &ianaId);
442 ~QTzTimeZonePrivate();
444 QTzTimeZonePrivate *clone()
const override;
446 QLocale::Territory territory()
const override;
447 QString comment()
const override;
449 using QTimeZonePrivate::displayName;
450 QString displayName(QTimeZone::TimeType timeType,
451 QTimeZone::NameType nameType,
452 const QLocale &locale)
const override;
453 QString abbreviation(qint64 atMSecsSinceEpoch)
const override;
455 int offsetFromUtc(qint64 atMSecsSinceEpoch)
const override;
456 int standardTimeOffset(qint64 atMSecsSinceEpoch)
const override;
457 int daylightTimeOffset(qint64 atMSecsSinceEpoch)
const override;
459 bool hasDaylightTime()
const override;
460 bool isDaylightTime(qint64 atMSecsSinceEpoch)
const override;
462 Data data(qint64 forMSecsSinceEpoch)
const override;
463 Data data(QTimeZone::TimeType timeType)
const override;
464 bool isDataLocale(
const QLocale &locale)
const override;
466 bool hasTransitions()
const override;
467 Data nextTransition(qint64 afterMSecsSinceEpoch)
const override;
468 Data previousTransition(qint64 beforeMSecsSinceEpoch)
const override;
470 QByteArray systemTimeZoneId()
const override;
472 bool isTimeZoneIdAvailable(QByteArrayView ianaId)
const override;
473 QList<QByteArray> availableTimeZoneIds()
const override;
474 QList<QByteArray> availableTimeZoneIds(QLocale::Territory territory)
const override;
477 static QByteArray staticSystemTimeZoneId();
478 QList<QTimeZonePrivate::Data> getPosixTransitions(qint64 msNear)
const;
480 Data dataForTzTransition(QTzTransitionTime tran)
const;
481 Data dataFromRule(QTzTransitionRule rule, qint64 msecsSinceEpoch)
const;
482 QTzTimeZoneCacheEntry cached_data;
483 const QList<QTzTransitionTime> &tranCache()
const {
return cached_data.m_tranTimes; }
486class Q_AUTOTEST_EXPORT QIcuTimeZonePrivate final :
public QTimeZonePrivate
488 QIcuTimeZonePrivate &operator=(
const QIcuTimeZonePrivate &)
const =
delete;
489 QIcuTimeZonePrivate(
const QIcuTimeZonePrivate &other);
492 QIcuTimeZonePrivate();
494 QIcuTimeZonePrivate(
const QByteArray &ianaId);
495 ~QIcuTimeZonePrivate();
497 QIcuTimeZonePrivate *clone()
const override;
499 using QTimeZonePrivate::displayName;
500 QString displayName(QTimeZone::TimeType timeType, QTimeZone::NameType nameType,
501 const QLocale &locale)
const override;
503 int offsetFromUtc(qint64 atMSecsSinceEpoch)
const override;
504 int standardTimeOffset(qint64 atMSecsSinceEpoch)
const override;
505 int daylightTimeOffset(qint64 atMSecsSinceEpoch)
const override;
507 bool hasDaylightTime()
const override;
508 bool isDaylightTime(qint64 atMSecsSinceEpoch)
const override;
510 using QTimeZonePrivate::data;
511 Data data(qint64 forMSecsSinceEpoch)
const override;
513 bool hasTransitions()
const override;
514 Data nextTransition(qint64 afterMSecsSinceEpoch)
const override;
515 Data previousTransition(qint64 beforeMSecsSinceEpoch)
const override;
517 QByteArray systemTimeZoneId()
const override;
519 bool isTimeZoneIdAvailable(QByteArrayView ianaId)
const override;
520 QList<QByteArray> availableTimeZoneIds()
const override;
521 QList<QByteArray> availableTimeZoneIds(QLocale::Territory territory)
const override;
522 QList<QByteArray> availableTimeZoneIds(
int offsetFromUtc)
const override;
525 void init(
const QByteArray &ianaId);
529#elif defined(Q_OS_WIN)
530class Q_AUTOTEST_EXPORT QWinTimeZonePrivate final :
public QTimeZonePrivate
532 QWinTimeZonePrivate &operator=(
const QWinTimeZonePrivate &)
const =
delete;
533 QWinTimeZonePrivate(
const QWinTimeZonePrivate &) =
default;
535 struct QWinTransitionRule {
537 int standardTimeBias;
538 int daylightTimeBias;
539 SYSTEMTIME standardTimeRule;
540 SYSTEMTIME daylightTimeRule;
544 QWinTimeZonePrivate();
546 QWinTimeZonePrivate(
const QByteArray &ianaId);
547 ~QWinTimeZonePrivate();
549 QWinTimeZonePrivate *clone()
const override;
551 QString comment()
const override;
553 using QTimeZonePrivate::displayName;
554 QString displayName(QTimeZone::TimeType timeType, QTimeZone::NameType nameType,
555 const QLocale &locale)
const override;
556 QString abbreviation(qint64 atMSecsSinceEpoch)
const override;
558 int offsetFromUtc(qint64 atMSecsSinceEpoch)
const override;
559 int standardTimeOffset(qint64 atMSecsSinceEpoch)
const override;
560 int daylightTimeOffset(qint64 atMSecsSinceEpoch)
const override;
562 bool hasDaylightTime()
const override;
563 bool isDaylightTime(qint64 atMSecsSinceEpoch)
const override;
565 using QTimeZonePrivate::data;
566 Data data(qint64 forMSecsSinceEpoch)
const override;
568 bool hasTransitions()
const override;
569 Data nextTransition(qint64 afterMSecsSinceEpoch)
const override;
570 Data previousTransition(qint64 beforeMSecsSinceEpoch)
const override;
572 QByteArray systemTimeZoneId()
const override;
574 QList<QByteArray> availableTimeZoneIds()
const override;
577 QTimeZonePrivate::Data ruleToData(
const QWinTransitionRule &rule, qint64 atMSecsSinceEpoch,
578 QTimeZone::TimeType type,
bool fakeDst =
false)
const;
580 void init(
const QByteArray &ianaId);
582 QByteArray m_windowsId;
583 QString m_displayName;
584 QString m_standardName;
585 QString m_daylightName;
586 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)