7#ifndef QTIMEZONEPRIVATE_P_H
8#define QTIMEZONEPRIVATE_P_H
23#include "private/qlocale_p.h"
24#include "private/qdatetime_p.h"
26#if QT_CONFIG(timezone_tzdb)
32#include <unicode/ucal.h>
36Q_FORWARD_DECLARE_OBJC_CLASS(NSTimeZone);
40#include <qt_windows.h>
54 QTimeZonePrivate &operator=(
const QTimeZonePrivate &)
const =
delete;
56 QTimeZonePrivate(
const QTimeZonePrivate &other) =
default;
61 qint64 atMSecsSinceEpoch;
63 int standardTimeOffset;
64 int daylightTimeOffset;
66 : atMSecsSinceEpoch(QTimeZonePrivate::invalidMSecs()),
67 offsetFromUtc(QTimeZonePrivate::invalidSeconds()),
68 standardTimeOffset(QTimeZonePrivate::invalidSeconds()),
69 daylightTimeOffset(QTimeZonePrivate::invalidSeconds())
71 Data(
const QString &name, qint64 when,
int offset,
int standard)
73 atMSecsSinceEpoch(when),
74 offsetFromUtc(offset),
75 standardTimeOffset(standard),
76 daylightTimeOffset(offset - standard)
79 typedef QList<Data> DataList;
83 virtual ~QTimeZonePrivate();
85 virtual QTimeZonePrivate *clone()
const = 0;
87 bool operator==(
const QTimeZonePrivate &other)
const;
88 bool operator!=(
const QTimeZonePrivate &other)
const;
92 QByteArray id()
const;
93 virtual QLocale::Territory territory()
const;
94 virtual QString comment()
const;
96 virtual QString displayName(qint64 atMSecsSinceEpoch,
97 QTimeZone::NameType nameType,
98 const QLocale &locale)
const;
99 virtual QString displayName(QTimeZone::TimeType timeType,
100 QTimeZone::NameType nameType,
101 const QLocale &locale)
const;
102 virtual QString abbreviation(qint64 atMSecsSinceEpoch)
const;
104 virtual int offsetFromUtc(qint64 atMSecsSinceEpoch)
const;
105 virtual int standardTimeOffset(qint64 atMSecsSinceEpoch)
const;
106 virtual int daylightTimeOffset(qint64 atMSecsSinceEpoch)
const;
108 virtual bool hasDaylightTime()
const;
109 virtual bool isDaylightTime(qint64 atMSecsSinceEpoch)
const;
111 virtual Data data(qint64 forMSecsSinceEpoch)
const;
112 virtual Data data(QTimeZone::TimeType timeType)
const;
113 virtual bool isDataLocale(
const QLocale &locale)
const;
114 static bool isAnglicLocale(
const QLocale &locale)
117 const QLocale::Language lang = locale.language();
118 return lang == QLocale::C
119 || (lang == QLocale::English && locale.script() == QLocale::LatinScript);
121 QDateTimePrivate::ZoneState stateAtZoneTime(qint64 forLocalMSecs,
122 QDateTimePrivate::TransitionOptions resolve)
const;
124 virtual bool hasTransitions()
const;
125 virtual Data nextTransition(qint64 afterMSecsSinceEpoch)
const;
126 virtual Data previousTransition(qint64 beforeMSecsSinceEpoch)
const;
127 DataList transitions(qint64 fromMSecsSinceEpoch, qint64 toMSecsSinceEpoch)
const;
129 virtual QByteArray systemTimeZoneId()
const;
131 QByteArrayView availableAlias(QByteArrayView ianaId)
const;
132 virtual bool isTimeZoneIdAvailable(QByteArrayView ianaId)
const;
133 virtual QList<QByteArray> availableTimeZoneIds()
const = 0;
134 virtual QList<QByteArray> availableTimeZoneIds(QLocale::Territory territory)
const;
135 virtual QList<QByteArray> availableTimeZoneIds(
int utcOffset)
const;
137 virtual void serialize(QDataStream &ds)
const;
140 [[nodiscard]]
static constexpr qint64 maxMSecs()
141 {
return (std::numeric_limits<qint64>::max)(); }
142 [[nodiscard]]
static constexpr qint64 minMSecs()
143 {
return (std::numeric_limits<qint64>::min)() + 1; }
144 [[nodiscard]]
static constexpr qint64 invalidMSecs()
145 {
return (std::numeric_limits<qint64>::min)(); }
146 [[nodiscard]]
static constexpr int invalidSeconds()
147 {
return (std::numeric_limits<
int>::min)(); }
148 static QTimeZone::OffsetData invalidOffsetData();
149 static QTimeZone::OffsetData toOffsetData(
const Data &data);
150 static bool isValidId(QByteArrayView ianaId);
151 static QString isoOffsetFormat(
int offsetFromUtc,
152 QTimeZone::NameType mode = QTimeZone::OffsetName);
154 static QByteArrayView aliasToIana(QByteArrayView alias);
155 static QByteArrayView ianaIdToWindowsId(QByteArrayView ianaId);
156 static QByteArrayView windowsIdToDefaultIanaId(QByteArrayView windowsId);
157 static QByteArrayView windowsIdToDefaultIanaId(QByteArrayView windowsId,
158 QLocale::Territory territory);
159 static QList<QByteArray> windowsIdToIanaIds(QByteArrayView windowsId);
160 static QList<QByteArray> windowsIdToIanaIds(QByteArrayView windowsId,
161 QLocale::Territory territory);
162 struct NamePrefixMatch
165 qsizetype nameLength = 0;
166 QTimeZone::TimeType timeType = QTimeZone::GenericTime;
167 operator
bool()
const {
return nameLength > 0; }
169 static NamePrefixMatch findLongNamePrefix(QStringView text,
const QLocale &locale,
170 std::optional<qint64> atEpochMillis = std::nullopt);
171 static NamePrefixMatch findNarrowOffsetPrefix(QStringView text,
const QLocale &locale);
173 static NamePrefixMatch findLongUtcPrefix(QStringView text);
176 [[nodiscard]]
static inline QString utcQString()
178 return QStringLiteral(
"UTC");
181 [[nodiscard]]
static inline QByteArray utcQByteArray()
183 return QByteArrayLiteral(
"UTC");
186 [[nodiscard]]
static QTimeZone utcQTimeZone();
188#ifdef QT_BUILD_INTERNAL
189 [[nodiscard]]
static inline const QTimeZonePrivate *extractPrivate(
const QTimeZone &zone)
191 return zone.d.operator->();
198 QList<QByteArrayView> matchingTimeZoneIds(QLocale::Territory territory)
const;
199 QList<QByteArrayView> matchingTimeZoneIds(
int utcOffset)
const;
201 static QList<QByteArray> uniqueSortedAliasPadded(QList<QByteArray> &&zoneIds);
202 static QList<QByteArray> padSortedWithAliases(QList<QByteArray> &&zoneIds);
204#if QT_CONFIG(timezone_locale)
206 QString localeName(qint64 atMSecsSinceEpoch,
int offsetFromUtc,
207 QTimeZone::TimeType timeType,
208 QTimeZone::NameType nameType,
209 const QLocale &locale)
const;
216class Q_AUTOTEST_EXPORT QUtcTimeZonePrivate final :
public QTimeZonePrivate
218 QUtcTimeZonePrivate &operator=(
const QUtcTimeZonePrivate &)
const =
delete;
219 QUtcTimeZonePrivate(
const QUtcTimeZonePrivate &other);
222 QUtcTimeZonePrivate();
224 QUtcTimeZonePrivate(
const QByteArray &utcId);
226 QUtcTimeZonePrivate(qint32 offsetSeconds);
228 QUtcTimeZonePrivate(
const QByteArray &zoneId,
int offsetSeconds,
const QString &name,
229 const QString &abbreviation, QLocale::Territory territory,
230 const QString &comment);
231 virtual ~QUtcTimeZonePrivate();
234 static qint64 offsetFromUtcString(QByteArrayView id);
236 QUtcTimeZonePrivate *clone()
const override;
238 Data data(qint64 forMSecsSinceEpoch)
const override;
239 Data data(QTimeZone::TimeType timeType)
const override;
240 bool isDataLocale(
const QLocale &locale)
const override;
242 QLocale::Territory territory()
const override;
243 QString comment()
const override;
245 QString displayName(qint64 atMSecsSinceEpoch,
246 QTimeZone::NameType nameType,
247 const QLocale &locale)
const override;
248 QString displayName(QTimeZone::TimeType timeType,
249 QTimeZone::NameType nameType,
250 const QLocale &locale)
const override;
251 QString abbreviation(qint64 atMSecsSinceEpoch)
const override;
253 int standardTimeOffset(qint64 atMSecsSinceEpoch)
const override;
254 int daylightTimeOffset(qint64 atMSecsSinceEpoch)
const override;
256 QByteArray systemTimeZoneId()
const override;
258 bool isTimeZoneIdAvailable(QByteArrayView ianaId)
const override;
259 QList<QByteArray> availableTimeZoneIds()
const override;
260 QList<QByteArray> availableTimeZoneIds(QLocale::Territory country)
const override;
261 QList<QByteArray> availableTimeZoneIds(
int utcOffset)
const override;
263 void serialize(QDataStream &ds)
const override;
266 void init(
const QByteArray &zoneId,
int offsetSeconds,
const QString &name,
267 const QString &abbreviation, QLocale::Territory territory,
268 const QString &comment);
271 QString m_abbreviation;
273 QLocale::Territory m_territory;
278#if QT_CONFIG(timezone_tzdb)
279class QChronoTimeZonePrivate final :
public QTimeZonePrivate
281 QChronoTimeZonePrivate &operator=(
const QChronoTimeZonePrivate &)
const =
delete;
282 QChronoTimeZonePrivate(
const QChronoTimeZonePrivate &) =
default;
284 QChronoTimeZonePrivate();
285 QChronoTimeZonePrivate(QByteArrayView id);
286 ~QChronoTimeZonePrivate() override;
287 QChronoTimeZonePrivate *clone()
const override;
289 QByteArray systemTimeZoneId()
const override;
291 QString abbreviation(qint64 atMSecsSinceEpoch)
const override;
292 int offsetFromUtc(qint64 atMSecsSinceEpoch)
const override;
293 int standardTimeOffset(qint64 atMSecsSinceEpoch)
const override;
294 int daylightTimeOffset(qint64 atMSecsSinceEpoch)
const override;
296 bool isTimeZoneIdAvailable(QByteArrayView ianaId)
const override;
297 QList<QByteArray> availableTimeZoneIds()
const override;
298 QList<QByteArray> availableTimeZoneIds(
int utcOffset)
const override;
300 bool hasDaylightTime()
const override;
301 bool isDaylightTime(qint64 atMSecsSinceEpoch)
const override;
303 Data data(qint64 forMSecsSinceEpoch)
const override;
305 bool hasTransitions()
const override;
306 Data nextTransition(qint64 afterMSecsSinceEpoch)
const override;
307 Data previousTransition(qint64 beforeMSecsSinceEpoch)
const override;
310 const std::chrono::time_zone *
const m_timeZone;
312#elif defined(Q_OS_DARWIN)
313class Q_AUTOTEST_EXPORT QMacTimeZonePrivate final :
public QTimeZonePrivate
315 QMacTimeZonePrivate &operator=(
const QMacTimeZonePrivate &)
const =
delete;
316 QMacTimeZonePrivate(
const QMacTimeZonePrivate &other);
319 QMacTimeZonePrivate();
321 QMacTimeZonePrivate(
const QByteArray &ianaId);
322 ~QMacTimeZonePrivate();
324 QMacTimeZonePrivate *clone()
const override;
326 QString comment()
const override;
328 using QTimeZonePrivate::displayName;
329 QString displayName(QTimeZone::TimeType timeType, QTimeZone::NameType nameType,
330 const QLocale &locale)
const override;
331 QString abbreviation(qint64 atMSecsSinceEpoch)
const override;
333 int offsetFromUtc(qint64 atMSecsSinceEpoch)
const override;
334 int standardTimeOffset(qint64 atMSecsSinceEpoch)
const override;
335 int daylightTimeOffset(qint64 atMSecsSinceEpoch)
const override;
337 bool hasDaylightTime()
const override;
338 bool isDaylightTime(qint64 atMSecsSinceEpoch)
const override;
340 using QTimeZonePrivate::data;
341 Data data(qint64 forMSecsSinceEpoch)
const override;
343 bool hasTransitions()
const override;
344 Data nextTransition(qint64 afterMSecsSinceEpoch)
const override;
345 Data previousTransition(qint64 beforeMSecsSinceEpoch)
const override;
347 QByteArray systemTimeZoneId()
const override;
348 bool isTimeZoneIdAvailable(QByteArrayView ianaId)
const override;
349 QList<QByteArray> availableTimeZoneIds()
const override;
351 NSTimeZone *nsTimeZone()
const;
354 void init(
const QByteArray &zoneId);
358#elif defined(Q_OS_ANDROID)
359class QAndroidTimeZonePrivate final :
public QTimeZonePrivate
361 QAndroidTimeZonePrivate &operator=(
const QAndroidTimeZonePrivate &)
const =
delete;
362 QAndroidTimeZonePrivate(
const QAndroidTimeZonePrivate &) =
default;
365 QAndroidTimeZonePrivate();
367 QAndroidTimeZonePrivate(QByteArrayView ianaId);
368 ~QAndroidTimeZonePrivate();
370 QAndroidTimeZonePrivate *clone()
const override;
372 using QTimeZonePrivate::displayName;
373 QString displayName(QTimeZone::TimeType timeType, QTimeZone::NameType nameType,
374 const QLocale &locale)
const override;
375 QString abbreviation(qint64 atMSecsSinceEpoch)
const override;
377 int offsetFromUtc(qint64 atMSecsSinceEpoch)
const override;
378 int standardTimeOffset(qint64 atMSecsSinceEpoch)
const override;
379 int daylightTimeOffset(qint64 atMSecsSinceEpoch)
const override;
381 bool hasDaylightTime()
const override;
382 bool isDaylightTime(qint64 atMSecsSinceEpoch)
const override;
384 using QTimeZonePrivate::data;
385 Data data(qint64 forMSecsSinceEpoch)
const override;
387 QByteArray systemTimeZoneId()
const override;
388 bool isTimeZoneIdAvailable(QByteArrayView ianaId)
const override;
389 QList<QByteArray> availableTimeZoneIds()
const override;
392 void init(QByteArrayView zoneId);
394 QJniObject androidTimeZone;
396#elif defined(Q_OS_UNIX) && !defined(Q_OS_VXWORKS) && !defined(Q_OS_WASM)
397struct QTzTransitionTime
399 qint64 atMSecsSinceEpoch;
402Q_DECLARE_TYPEINFO(QTzTransitionTime, Q_PRIMITIVE_TYPE);
403struct QTzTransitionRule
407 quint8 abbreviationIndex = 0;
409Q_DECLARE_TYPEINFO(QTzTransitionRule, Q_PRIMITIVE_TYPE);
410constexpr inline bool operator==(
const QTzTransitionRule &lhs,
const QTzTransitionRule &rhs)
noexcept
411{
return lhs.stdOffset == rhs.stdOffset && lhs.dstOffset == rhs.dstOffset && lhs.abbreviationIndex == rhs.abbreviationIndex; }
412constexpr inline bool operator!=(
const QTzTransitionRule &lhs,
const QTzTransitionRule &rhs)
noexcept
413{
return !operator==(lhs, rhs); }
417struct QTzTimeZoneCacheEntry
419 QList<QTzTransitionTime> m_tranTimes;
420 QList<QTzTransitionRule> m_tranRules;
421 QList<QByteArray> m_abbreviations;
422 QByteArray m_posixRule;
423 QTzTransitionRule m_preZoneRule;
424 bool m_hasDst =
false;
427class Q_AUTOTEST_EXPORT QTzTimeZonePrivate final :
public QTimeZonePrivate
429 QTzTimeZonePrivate &operator=(
const QTzTimeZonePrivate &)
const =
delete;
430 QTzTimeZonePrivate(
const QTzTimeZonePrivate &) =
default;
433 QTzTimeZonePrivate();
435 QTzTimeZonePrivate(
const QByteArray &ianaId);
436 ~QTzTimeZonePrivate();
438 QTzTimeZonePrivate *clone()
const override;
440 QLocale::Territory territory()
const override;
441 QString comment()
const override;
443 using QTimeZonePrivate::displayName;
444 QString displayName(QTimeZone::TimeType timeType,
445 QTimeZone::NameType nameType,
446 const QLocale &locale)
const override;
447 QString abbreviation(qint64 atMSecsSinceEpoch)
const override;
449 int offsetFromUtc(qint64 atMSecsSinceEpoch)
const override;
450 int standardTimeOffset(qint64 atMSecsSinceEpoch)
const override;
451 int daylightTimeOffset(qint64 atMSecsSinceEpoch)
const override;
453 bool hasDaylightTime()
const override;
454 bool isDaylightTime(qint64 atMSecsSinceEpoch)
const override;
456 Data data(qint64 forMSecsSinceEpoch)
const override;
457 Data data(QTimeZone::TimeType timeType)
const override;
458 bool isDataLocale(
const QLocale &locale)
const override;
460 bool hasTransitions()
const override;
461 Data nextTransition(qint64 afterMSecsSinceEpoch)
const override;
462 Data previousTransition(qint64 beforeMSecsSinceEpoch)
const override;
464 QByteArray systemTimeZoneId()
const override;
466 bool isTimeZoneIdAvailable(QByteArrayView ianaId)
const override;
467 QList<QByteArray> availableTimeZoneIds()
const override;
468 QList<QByteArray> availableTimeZoneIds(QLocale::Territory territory)
const override;
471 static QByteArray staticSystemTimeZoneId();
472 QList<QTimeZonePrivate::Data> getPosixTransitions(qint64 msNear)
const;
474 Data dataForTzTransition(QTzTransitionTime tran)
const;
475 Data dataFromRule(QTzTransitionRule rule, qint64 msecsSinceEpoch)
const;
476 QTzTimeZoneCacheEntry cached_data;
477 const QList<QTzTransitionTime> &tranCache()
const {
return cached_data.m_tranTimes; }
480class Q_AUTOTEST_EXPORT QIcuTimeZonePrivate final :
public QTimeZonePrivate
482 QIcuTimeZonePrivate &operator=(
const QIcuTimeZonePrivate &)
const =
delete;
483 QIcuTimeZonePrivate(
const QIcuTimeZonePrivate &other);
486 QIcuTimeZonePrivate();
488 QIcuTimeZonePrivate(
const QByteArray &ianaId);
489 ~QIcuTimeZonePrivate();
491 QIcuTimeZonePrivate *clone()
const override;
493 using QTimeZonePrivate::displayName;
494 QString displayName(QTimeZone::TimeType timeType, QTimeZone::NameType nameType,
495 const QLocale &locale)
const override;
497 int offsetFromUtc(qint64 atMSecsSinceEpoch)
const override;
498 int standardTimeOffset(qint64 atMSecsSinceEpoch)
const override;
499 int daylightTimeOffset(qint64 atMSecsSinceEpoch)
const override;
501 bool hasDaylightTime()
const override;
502 bool isDaylightTime(qint64 atMSecsSinceEpoch)
const override;
504 using QTimeZonePrivate::data;
505 Data data(qint64 forMSecsSinceEpoch)
const override;
507 bool hasTransitions()
const override;
508 Data nextTransition(qint64 afterMSecsSinceEpoch)
const override;
509 Data previousTransition(qint64 beforeMSecsSinceEpoch)
const override;
511 QByteArray systemTimeZoneId()
const override;
513 bool isTimeZoneIdAvailable(QByteArrayView ianaId)
const override;
514 QList<QByteArray> availableTimeZoneIds()
const override;
515 QList<QByteArray> availableTimeZoneIds(QLocale::Territory territory)
const override;
516 QList<QByteArray> availableTimeZoneIds(
int offsetFromUtc)
const override;
519 void init(
const QByteArray &ianaId);
523#elif defined(Q_OS_WIN)
524class Q_AUTOTEST_EXPORT QWinTimeZonePrivate final :
public QTimeZonePrivate
526 QWinTimeZonePrivate &operator=(
const QWinTimeZonePrivate &)
const =
delete;
527 QWinTimeZonePrivate(
const QWinTimeZonePrivate &) =
default;
529 struct QWinTransitionRule {
531 int standardTimeBias;
532 int daylightTimeBias;
533 SYSTEMTIME standardTimeRule;
534 SYSTEMTIME daylightTimeRule;
538 QWinTimeZonePrivate();
540 QWinTimeZonePrivate(
const QByteArray &ianaId);
541 ~QWinTimeZonePrivate();
543 QWinTimeZonePrivate *clone()
const override;
545 QString comment()
const override;
547 using QTimeZonePrivate::displayName;
548 QString displayName(QTimeZone::TimeType timeType, QTimeZone::NameType nameType,
549 const QLocale &locale)
const override;
550 QString abbreviation(qint64 atMSecsSinceEpoch)
const override;
552 int offsetFromUtc(qint64 atMSecsSinceEpoch)
const override;
553 int standardTimeOffset(qint64 atMSecsSinceEpoch)
const override;
554 int daylightTimeOffset(qint64 atMSecsSinceEpoch)
const override;
556 bool hasDaylightTime()
const override;
557 bool isDaylightTime(qint64 atMSecsSinceEpoch)
const override;
559 using QTimeZonePrivate::data;
560 Data data(qint64 forMSecsSinceEpoch)
const override;
562 bool hasTransitions()
const override;
563 Data nextTransition(qint64 afterMSecsSinceEpoch)
const override;
564 Data previousTransition(qint64 beforeMSecsSinceEpoch)
const override;
566 QByteArray systemTimeZoneId()
const override;
568 QList<QByteArray> availableTimeZoneIds()
const override;
571 QTimeZonePrivate::Data ruleToData(
const QWinTransitionRule &rule, qint64 atMSecsSinceEpoch,
572 QTimeZone::TimeType type,
bool fakeDst =
false)
const;
574 void init(
const QByteArray &ianaId);
576 QByteArray m_windowsId;
577 QString m_displayName;
578 QString m_standardName;
579 QString m_daylightName;
580 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)