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);
181 [[nodiscard]]
static inline QString utcQString()
183 return QStringLiteral(
"UTC");
186 [[nodiscard]]
static inline QByteArray utcQByteArray()
188 return QByteArrayLiteral(
"UTC");
191 [[nodiscard]]
static QTimeZone utcQTimeZone();
193#ifdef QT_BUILD_INTERNAL
194 [[nodiscard]]
static inline const QTimeZonePrivate *extractPrivate(
const QTimeZone &zone)
196 return zone.d.operator->();
203 QList<QByteArrayView> matchingTimeZoneIds(QLocale::Territory territory)
const;
204 QList<QByteArrayView> matchingTimeZoneIds(
int utcOffset)
const;
206 static QList<QByteArray> uniqueSortedAliasPadded(QList<QByteArray> &&zoneIds);
207 static QList<QByteArray> padSortedWithAliases(QList<QByteArray> &&zoneIds);
209#if QT_CONFIG(timezone_locale)
211 QString localeName(qint64 atMSecsSinceEpoch,
int offsetFromUtc,
212 QTimeZone::TimeType timeType,
213 QTimeZone::NameType nameType,
214 const QLocale &locale)
const;
221class Q_AUTOTEST_EXPORT QUtcTimeZonePrivate final :
public QTimeZonePrivate
223 QUtcTimeZonePrivate &operator=(
const QUtcTimeZonePrivate &)
const =
delete;
224 QUtcTimeZonePrivate(
const QUtcTimeZonePrivate &other);
227 QUtcTimeZonePrivate();
229 QUtcTimeZonePrivate(
const QByteArray &utcId);
231 QUtcTimeZonePrivate(qint32 offsetSeconds);
233 QUtcTimeZonePrivate(
const QByteArray &zoneId,
int offsetSeconds,
const QString &name,
234 const QString &abbreviation, QLocale::Territory territory,
235 const QString &comment);
236 virtual ~QUtcTimeZonePrivate();
239 static qint64 offsetFromUtcString(QByteArrayView id);
241 QUtcTimeZonePrivate *clone()
const override;
243 Data data(qint64 forMSecsSinceEpoch)
const override;
244 Data data(QTimeZone::TimeType timeType)
const override;
245 bool isDataLocale(
const QLocale &locale)
const override;
247 QLocale::Territory territory()
const override;
248 QString comment()
const override;
250 QString displayName(qint64 atMSecsSinceEpoch,
251 QTimeZone::NameType nameType,
252 const QLocale &locale)
const override;
253 QString displayName(QTimeZone::TimeType timeType,
254 QTimeZone::NameType nameType,
255 const QLocale &locale)
const override;
256 QString abbreviation(qint64 atMSecsSinceEpoch)
const override;
258 int standardTimeOffset(qint64 atMSecsSinceEpoch)
const override;
259 int daylightTimeOffset(qint64 atMSecsSinceEpoch)
const override;
261 QByteArray systemTimeZoneId()
const override;
263 bool isTimeZoneIdAvailable(QByteArrayView ianaId)
const override;
264 QList<QByteArray> availableTimeZoneIds()
const override;
265 QList<QByteArray> availableTimeZoneIds(QLocale::Territory country)
const override;
266 QList<QByteArray> availableTimeZoneIds(
int utcOffset)
const override;
268 void serialize(QDataStream &ds)
const override;
271 void init(
const QByteArray &zoneId,
int offsetSeconds,
const QString &name,
272 const QString &abbreviation, QLocale::Territory territory,
273 const QString &comment);
276 QString m_abbreviation;
278 QLocale::Territory m_territory;
283#if QT_CONFIG(timezone_tzdb)
284class QChronoTimeZonePrivate final :
public QTimeZonePrivate
286 QChronoTimeZonePrivate &operator=(
const QChronoTimeZonePrivate &)
const =
delete;
287 QChronoTimeZonePrivate(
const QChronoTimeZonePrivate &) =
default;
289 QChronoTimeZonePrivate();
290 QChronoTimeZonePrivate(QByteArrayView id);
291 ~QChronoTimeZonePrivate() override;
292 QChronoTimeZonePrivate *clone()
const override;
294 QByteArray systemTimeZoneId()
const override;
296 QString abbreviation(qint64 atMSecsSinceEpoch)
const override;
297 int offsetFromUtc(qint64 atMSecsSinceEpoch)
const override;
298 int standardTimeOffset(qint64 atMSecsSinceEpoch)
const override;
299 int daylightTimeOffset(qint64 atMSecsSinceEpoch)
const override;
301 bool isTimeZoneIdAvailable(QByteArrayView ianaId)
const override;
302 QList<QByteArray> availableTimeZoneIds()
const override;
303 QList<QByteArray> availableTimeZoneIds(
int utcOffset)
const override;
305 bool hasDaylightTime()
const override;
306 bool isDaylightTime(qint64 atMSecsSinceEpoch)
const override;
308 Data data(qint64 forMSecsSinceEpoch)
const override;
310 bool hasTransitions()
const override;
311 Data nextTransition(qint64 afterMSecsSinceEpoch)
const override;
312 Data previousTransition(qint64 beforeMSecsSinceEpoch)
const override;
315 const std::chrono::time_zone *
const m_timeZone;
317#elif defined(Q_OS_DARWIN)
318class Q_AUTOTEST_EXPORT QMacTimeZonePrivate final :
public QTimeZonePrivate
320 QMacTimeZonePrivate &operator=(
const QMacTimeZonePrivate &)
const =
delete;
321 QMacTimeZonePrivate(
const QMacTimeZonePrivate &other);
324 QMacTimeZonePrivate();
326 QMacTimeZonePrivate(
const QByteArray &ianaId);
327 ~QMacTimeZonePrivate();
329 QMacTimeZonePrivate *clone()
const override;
331 QString comment()
const override;
333 using QTimeZonePrivate::displayName;
334 QString displayName(QTimeZone::TimeType timeType, QTimeZone::NameType nameType,
335 const QLocale &locale)
const override;
336 QString abbreviation(qint64 atMSecsSinceEpoch)
const override;
338 int offsetFromUtc(qint64 atMSecsSinceEpoch)
const override;
339 int standardTimeOffset(qint64 atMSecsSinceEpoch)
const override;
340 int daylightTimeOffset(qint64 atMSecsSinceEpoch)
const override;
342 bool hasDaylightTime()
const override;
343 bool isDaylightTime(qint64 atMSecsSinceEpoch)
const override;
345 using QTimeZonePrivate::data;
346 Data data(qint64 forMSecsSinceEpoch)
const override;
348 bool hasTransitions()
const override;
349 Data nextTransition(qint64 afterMSecsSinceEpoch)
const override;
350 Data previousTransition(qint64 beforeMSecsSinceEpoch)
const override;
352 QByteArray systemTimeZoneId()
const override;
353 bool isTimeZoneIdAvailable(QByteArrayView ianaId)
const override;
354 QList<QByteArray> availableTimeZoneIds()
const override;
356 NSTimeZone *nsTimeZone()
const;
359 void init(
const QByteArray &zoneId);
363#elif defined(Q_OS_ANDROID)
364class QAndroidTimeZonePrivate final :
public QTimeZonePrivate
366 QAndroidTimeZonePrivate &operator=(
const QAndroidTimeZonePrivate &)
const =
delete;
367 QAndroidTimeZonePrivate(
const QAndroidTimeZonePrivate &) =
default;
370 QAndroidTimeZonePrivate();
372 QAndroidTimeZonePrivate(QByteArrayView ianaId);
373 ~QAndroidTimeZonePrivate();
375 QAndroidTimeZonePrivate *clone()
const override;
377 using QTimeZonePrivate::displayName;
378 QString displayName(QTimeZone::TimeType timeType, QTimeZone::NameType nameType,
379 const QLocale &locale)
const override;
380 QString abbreviation(qint64 atMSecsSinceEpoch)
const override;
382 int offsetFromUtc(qint64 atMSecsSinceEpoch)
const override;
383 int standardTimeOffset(qint64 atMSecsSinceEpoch)
const override;
384 int daylightTimeOffset(qint64 atMSecsSinceEpoch)
const override;
386 bool hasDaylightTime()
const override;
387 bool isDaylightTime(qint64 atMSecsSinceEpoch)
const override;
389 using QTimeZonePrivate::data;
390 Data data(qint64 forMSecsSinceEpoch)
const override;
392 QByteArray systemTimeZoneId()
const override;
393 bool isTimeZoneIdAvailable(QByteArrayView ianaId)
const override;
394 QList<QByteArray> availableTimeZoneIds()
const override;
397 void init(QByteArrayView zoneId);
399 QJniObject androidTimeZone;
401#elif defined(Q_OS_UNIX) && !defined(Q_OS_VXWORKS) && !defined(Q_OS_WASM) && !defined(Q_OS_OHOS)
402struct QTzTransitionTime
404 qint64 atMSecsSinceEpoch;
407Q_DECLARE_TYPEINFO(QTzTransitionTime, Q_PRIMITIVE_TYPE);
408struct QTzTransitionRule
412 quint8 abbreviationIndex = 0;
414Q_DECLARE_TYPEINFO(QTzTransitionRule, Q_PRIMITIVE_TYPE);
415constexpr inline bool operator==(
const QTzTransitionRule &lhs,
const QTzTransitionRule &rhs)
noexcept
416{
return lhs.stdOffset == rhs.stdOffset && lhs.dstOffset == rhs.dstOffset && lhs.abbreviationIndex == rhs.abbreviationIndex; }
417constexpr inline bool operator!=(
const QTzTransitionRule &lhs,
const QTzTransitionRule &rhs)
noexcept
418{
return !operator==(lhs, rhs); }
422struct QTzTimeZoneCacheEntry
424 QList<QTzTransitionTime> m_tranTimes;
425 QList<QTzTransitionRule> m_tranRules;
426 QList<QByteArray> m_abbreviations;
427 QByteArray m_posixRule;
428 QTzTransitionRule m_preZoneRule;
429 bool m_hasDst =
false;
432class Q_AUTOTEST_EXPORT QTzTimeZonePrivate final :
public QTimeZonePrivate
434 QTzTimeZonePrivate &operator=(
const QTzTimeZonePrivate &)
const =
delete;
435 QTzTimeZonePrivate(
const QTzTimeZonePrivate &) =
default;
438 QTzTimeZonePrivate();
440 QTzTimeZonePrivate(
const QByteArray &ianaId);
441 ~QTzTimeZonePrivate();
443 QTzTimeZonePrivate *clone()
const override;
445 QLocale::Territory territory()
const override;
446 QString comment()
const override;
448 using QTimeZonePrivate::displayName;
449 QString displayName(QTimeZone::TimeType timeType,
450 QTimeZone::NameType nameType,
451 const QLocale &locale)
const override;
452 QString abbreviation(qint64 atMSecsSinceEpoch)
const override;
454 int offsetFromUtc(qint64 atMSecsSinceEpoch)
const override;
455 int standardTimeOffset(qint64 atMSecsSinceEpoch)
const override;
456 int daylightTimeOffset(qint64 atMSecsSinceEpoch)
const override;
458 bool hasDaylightTime()
const override;
459 bool isDaylightTime(qint64 atMSecsSinceEpoch)
const override;
461 Data data(qint64 forMSecsSinceEpoch)
const override;
462 Data data(QTimeZone::TimeType timeType)
const override;
463 bool isDataLocale(
const QLocale &locale)
const override;
465 bool hasTransitions()
const override;
466 Data nextTransition(qint64 afterMSecsSinceEpoch)
const override;
467 Data previousTransition(qint64 beforeMSecsSinceEpoch)
const override;
469 QByteArray systemTimeZoneId()
const override;
471 bool isTimeZoneIdAvailable(QByteArrayView ianaId)
const override;
472 QList<QByteArray> availableTimeZoneIds()
const override;
473 QList<QByteArray> availableTimeZoneIds(QLocale::Territory territory)
const override;
476 static QByteArray staticSystemTimeZoneId();
477 QList<QTimeZonePrivate::Data> getPosixTransitions(qint64 msNear)
const;
479 Data dataForTzTransition(QTzTransitionTime tran)
const;
480 Data dataFromRule(QTzTransitionRule rule, qint64 msecsSinceEpoch)
const;
481 QTzTimeZoneCacheEntry cached_data;
482 const QList<QTzTransitionTime> &tranCache()
const {
return cached_data.m_tranTimes; }
485class Q_AUTOTEST_EXPORT QIcuTimeZonePrivate final :
public QTimeZonePrivate
487 QIcuTimeZonePrivate &operator=(
const QIcuTimeZonePrivate &)
const =
delete;
488 QIcuTimeZonePrivate(
const QIcuTimeZonePrivate &other);
491 QIcuTimeZonePrivate();
493 QIcuTimeZonePrivate(
const QByteArray &ianaId);
494 ~QIcuTimeZonePrivate();
496 QIcuTimeZonePrivate *clone()
const override;
498 using QTimeZonePrivate::displayName;
499 QString displayName(QTimeZone::TimeType timeType, QTimeZone::NameType nameType,
500 const QLocale &locale)
const override;
502 int offsetFromUtc(qint64 atMSecsSinceEpoch)
const override;
503 int standardTimeOffset(qint64 atMSecsSinceEpoch)
const override;
504 int daylightTimeOffset(qint64 atMSecsSinceEpoch)
const override;
506 bool hasDaylightTime()
const override;
507 bool isDaylightTime(qint64 atMSecsSinceEpoch)
const override;
509 using QTimeZonePrivate::data;
510 Data data(qint64 forMSecsSinceEpoch)
const override;
512 bool hasTransitions()
const override;
513 Data nextTransition(qint64 afterMSecsSinceEpoch)
const override;
514 Data previousTransition(qint64 beforeMSecsSinceEpoch)
const override;
516 QByteArray systemTimeZoneId()
const override;
518 bool isTimeZoneIdAvailable(QByteArrayView ianaId)
const override;
519 QList<QByteArray> availableTimeZoneIds()
const override;
520 QList<QByteArray> availableTimeZoneIds(QLocale::Territory territory)
const override;
521 QList<QByteArray> availableTimeZoneIds(
int offsetFromUtc)
const override;
524 void init(
const QByteArray &ianaId);
528#elif defined(Q_OS_WIN)
529class Q_AUTOTEST_EXPORT QWinTimeZonePrivate final :
public QTimeZonePrivate
531 QWinTimeZonePrivate &operator=(
const QWinTimeZonePrivate &)
const =
delete;
532 QWinTimeZonePrivate(
const QWinTimeZonePrivate &) =
default;
534 struct QWinTransitionRule {
536 int standardTimeBias;
537 int daylightTimeBias;
538 SYSTEMTIME standardTimeRule;
539 SYSTEMTIME daylightTimeRule;
543 QWinTimeZonePrivate();
545 QWinTimeZonePrivate(
const QByteArray &ianaId);
546 ~QWinTimeZonePrivate();
548 QWinTimeZonePrivate *clone()
const override;
550 QString comment()
const override;
552 using QTimeZonePrivate::displayName;
553 QString displayName(QTimeZone::TimeType timeType, QTimeZone::NameType nameType,
554 const QLocale &locale)
const override;
555 QString abbreviation(qint64 atMSecsSinceEpoch)
const override;
557 int offsetFromUtc(qint64 atMSecsSinceEpoch)
const override;
558 int standardTimeOffset(qint64 atMSecsSinceEpoch)
const override;
559 int daylightTimeOffset(qint64 atMSecsSinceEpoch)
const override;
561 bool hasDaylightTime()
const override;
562 bool isDaylightTime(qint64 atMSecsSinceEpoch)
const override;
564 using QTimeZonePrivate::data;
565 Data data(qint64 forMSecsSinceEpoch)
const override;
567 bool hasTransitions()
const override;
568 Data nextTransition(qint64 afterMSecsSinceEpoch)
const override;
569 Data previousTransition(qint64 beforeMSecsSinceEpoch)
const override;
571 QByteArray systemTimeZoneId()
const override;
573 QList<QByteArray> availableTimeZoneIds()
const override;
576 QTimeZonePrivate::Data ruleToData(
const QWinTransitionRule &rule, qint64 atMSecsSinceEpoch,
577 QTimeZone::TimeType type,
bool fakeDst =
false)
const;
579 void init(
const QByteArray &ianaId);
581 QByteArray m_windowsId;
582 QString m_displayName;
583 QString m_standardName;
584 QString m_daylightName;
585 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)