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)
31#include <unicode/ucal.h>
35Q_FORWARD_DECLARE_OBJC_CLASS(NSTimeZone);
39#include <qt_windows.h>
53 QTimeZonePrivate &operator=(
const QTimeZonePrivate &)
const =
delete;
55 QTimeZonePrivate(
const QTimeZonePrivate &other) =
default;
60 qint64 atMSecsSinceEpoch;
62 int standardTimeOffset;
63 int daylightTimeOffset;
65 : atMSecsSinceEpoch(QTimeZonePrivate::invalidMSecs()),
66 offsetFromUtc(QTimeZonePrivate::invalidSeconds()),
67 standardTimeOffset(QTimeZonePrivate::invalidSeconds()),
68 daylightTimeOffset(QTimeZonePrivate::invalidSeconds())
70 Data(
const QString &name, qint64 when,
int offset,
int standard)
72 atMSecsSinceEpoch(when),
73 offsetFromUtc(offset),
74 standardTimeOffset(standard),
75 daylightTimeOffset(offset - standard)
78 typedef QList<Data> DataList;
82 virtual ~QTimeZonePrivate();
84 virtual QTimeZonePrivate *clone()
const = 0;
86 bool operator==(
const QTimeZonePrivate &other)
const;
87 bool operator!=(
const QTimeZonePrivate &other)
const;
91 QByteArray id()
const;
92 virtual QLocale::Territory territory()
const;
93 virtual QString comment()
const;
95 virtual QString displayName(qint64 atMSecsSinceEpoch,
96 QTimeZone::NameType nameType,
97 const QLocale &locale)
const;
98 virtual QString displayName(QTimeZone::TimeType timeType,
99 QTimeZone::NameType nameType,
100 const QLocale &locale)
const;
101 virtual QString abbreviation(qint64 atMSecsSinceEpoch)
const;
103 virtual int offsetFromUtc(qint64 atMSecsSinceEpoch)
const;
104 virtual int standardTimeOffset(qint64 atMSecsSinceEpoch)
const;
105 virtual int daylightTimeOffset(qint64 atMSecsSinceEpoch)
const;
107 virtual bool hasDaylightTime()
const;
108 virtual bool isDaylightTime(qint64 atMSecsSinceEpoch)
const;
110 virtual Data data(qint64 forMSecsSinceEpoch)
const;
111 virtual Data data(QTimeZone::TimeType timeType)
const;
112 virtual bool isDataLocale(
const QLocale &locale)
const;
113 static bool isAnglicLocale(
const QLocale &locale)
116 const QLocale::Language lang = locale.language();
117 return lang == QLocale::C
118 || (lang == QLocale::English && locale.script() == QLocale::LatinScript);
120 QDateTimePrivate::ZoneState stateAtZoneTime(qint64 forLocalMSecs,
121 QDateTimePrivate::TransitionOptions resolve)
const;
123 virtual bool hasTransitions()
const;
124 virtual Data nextTransition(qint64 afterMSecsSinceEpoch)
const;
125 virtual Data previousTransition(qint64 beforeMSecsSinceEpoch)
const;
126 DataList transitions(qint64 fromMSecsSinceEpoch, qint64 toMSecsSinceEpoch)
const;
128 virtual QByteArray systemTimeZoneId()
const;
130 virtual bool isTimeZoneIdAvailable(
const QByteArray &ianaId)
const;
131 virtual QList<QByteArray> availableTimeZoneIds()
const = 0;
132 virtual QList<QByteArray> availableTimeZoneIds(QLocale::Territory territory)
const;
133 virtual QList<QByteArray> availableTimeZoneIds(
int utcOffset)
const;
135 virtual void serialize(QDataStream &ds)
const;
138 [[nodiscard]]
static constexpr qint64 maxMSecs()
139 {
return (std::numeric_limits<qint64>::max)(); }
140 [[nodiscard]]
static constexpr qint64 minMSecs()
141 {
return (std::numeric_limits<qint64>::min)() + 1; }
142 [[nodiscard]]
static constexpr qint64 invalidMSecs()
143 {
return (std::numeric_limits<qint64>::min)(); }
144 [[nodiscard]]
static constexpr int invalidSeconds()
145 {
return (std::numeric_limits<
int>::min)(); }
146 static QTimeZone::OffsetData invalidOffsetData();
147 static QTimeZone::OffsetData toOffsetData(
const Data &data);
148 static bool isValidId(
const QByteArray &ianaId);
149 static QString isoOffsetFormat(
int offsetFromUtc,
150 QTimeZone::NameType mode = QTimeZone::OffsetName);
152 static QByteArray aliasToIana(QByteArrayView alias);
153 static QByteArray ianaIdToWindowsId(
const QByteArray &ianaId);
154 static QByteArray windowsIdToDefaultIanaId(
const QByteArray &windowsId);
155 static QByteArray windowsIdToDefaultIanaId(
const QByteArray &windowsId,
156 QLocale::Territory territory);
157 static QList<QByteArray> windowsIdToIanaIds(
const QByteArray &windowsId);
158 static QList<QByteArray> windowsIdToIanaIds(
const QByteArray &windowsId,
159 QLocale::Territory territory);
160 struct NamePrefixMatch
163 qsizetype nameLength = 0;
164 QTimeZone::TimeType timeType = QTimeZone::GenericTime;
165 operator
bool()
const {
return nameLength > 0; }
167 static NamePrefixMatch findLongNamePrefix(QStringView text,
const QLocale &locale,
168 std::optional<qint64> atEpochMillis = std::nullopt);
169 static NamePrefixMatch findNarrowOffsetPrefix(QStringView text,
const QLocale &locale);
171 static NamePrefixMatch findLongUtcPrefix(QStringView text);
174 [[nodiscard]]
static inline QString utcQString()
176 return QStringLiteral(
"UTC");
179 [[nodiscard]]
static inline QByteArray utcQByteArray()
181 return QByteArrayLiteral(
"UTC");
184 [[nodiscard]]
static QTimeZone utcQTimeZone();
186#ifdef QT_BUILD_INTERNAL
187 [[nodiscard]]
static inline const QTimeZonePrivate *extractPrivate(
const QTimeZone &zone)
189 return zone.d.operator->();
196 QList<QByteArrayView> matchingTimeZoneIds(QLocale::Territory territory)
const;
197 QList<QByteArrayView> matchingTimeZoneIds(
int utcOffset)
const;
199#if QT_CONFIG(timezone_locale)
201 QString localeName(qint64 atMSecsSinceEpoch,
int offsetFromUtc,
202 QTimeZone::TimeType timeType,
203 QTimeZone::NameType nameType,
204 const QLocale &locale)
const;
211class Q_AUTOTEST_EXPORT QUtcTimeZonePrivate final :
public QTimeZonePrivate
213 QUtcTimeZonePrivate &operator=(
const QUtcTimeZonePrivate &)
const =
delete;
214 QUtcTimeZonePrivate(
const QUtcTimeZonePrivate &other);
217 QUtcTimeZonePrivate();
219 QUtcTimeZonePrivate(
const QByteArray &utcId);
221 QUtcTimeZonePrivate(qint32 offsetSeconds);
223 QUtcTimeZonePrivate(
const QByteArray &zoneId,
int offsetSeconds,
const QString &name,
224 const QString &abbreviation, QLocale::Territory territory,
225 const QString &comment);
226 virtual ~QUtcTimeZonePrivate();
229 static qint64 offsetFromUtcString(QByteArrayView id);
231 QUtcTimeZonePrivate *clone()
const override;
233 Data data(qint64 forMSecsSinceEpoch)
const override;
234 Data data(QTimeZone::TimeType timeType)
const override;
235 bool isDataLocale(
const QLocale &locale)
const override;
237 QLocale::Territory territory()
const override;
238 QString comment()
const override;
240 QString displayName(qint64 atMSecsSinceEpoch,
241 QTimeZone::NameType nameType,
242 const QLocale &locale)
const override;
243 QString displayName(QTimeZone::TimeType timeType,
244 QTimeZone::NameType nameType,
245 const QLocale &locale)
const override;
246 QString abbreviation(qint64 atMSecsSinceEpoch)
const override;
248 int standardTimeOffset(qint64 atMSecsSinceEpoch)
const override;
249 int daylightTimeOffset(qint64 atMSecsSinceEpoch)
const override;
251 QByteArray systemTimeZoneId()
const override;
253 bool isTimeZoneIdAvailable(
const QByteArray &ianaId)
const override;
254 QList<QByteArray> availableTimeZoneIds()
const override;
255 QList<QByteArray> availableTimeZoneIds(QLocale::Territory country)
const override;
256 QList<QByteArray> availableTimeZoneIds(
int utcOffset)
const override;
258 void serialize(QDataStream &ds)
const override;
261 void init(
const QByteArray &zoneId,
int offsetSeconds,
const QString &name,
262 const QString &abbreviation, QLocale::Territory territory,
263 const QString &comment);
266 QString m_abbreviation;
268 QLocale::Territory m_territory;
273#if QT_CONFIG(timezone_tzdb)
274class QChronoTimeZonePrivate final :
public QTimeZonePrivate
276 QChronoTimeZonePrivate &operator=(
const QChronoTimeZonePrivate &)
const =
delete;
277 QChronoTimeZonePrivate(
const QChronoTimeZonePrivate &) =
default;
279 QChronoTimeZonePrivate();
280 QChronoTimeZonePrivate(QByteArrayView id);
281 ~QChronoTimeZonePrivate() override;
282 QChronoTimeZonePrivate *clone()
const override;
284 QByteArray systemTimeZoneId()
const override;
286 QString abbreviation(qint64 atMSecsSinceEpoch)
const override;
287 int offsetFromUtc(qint64 atMSecsSinceEpoch)
const override;
288 int standardTimeOffset(qint64 atMSecsSinceEpoch)
const override;
289 int daylightTimeOffset(qint64 atMSecsSinceEpoch)
const override;
291 bool isTimeZoneIdAvailable(
const QByteArray &ianaId)
const override;
292 QList<QByteArray> availableTimeZoneIds()
const override;
293 QList<QByteArray> availableTimeZoneIds(
int utcOffset)
const override;
295 bool hasDaylightTime()
const override;
296 bool isDaylightTime(qint64 atMSecsSinceEpoch)
const override;
298 Data data(qint64 forMSecsSinceEpoch)
const override;
300 bool hasTransitions()
const override;
301 Data nextTransition(qint64 afterMSecsSinceEpoch)
const override;
302 Data previousTransition(qint64 beforeMSecsSinceEpoch)
const override;
305 const std::chrono::time_zone *
const m_timeZone;
307#elif defined(Q_OS_DARWIN)
308class Q_AUTOTEST_EXPORT QMacTimeZonePrivate final :
public QTimeZonePrivate
310 QMacTimeZonePrivate &operator=(
const QMacTimeZonePrivate &)
const =
delete;
311 QMacTimeZonePrivate(
const QMacTimeZonePrivate &other);
314 QMacTimeZonePrivate();
316 QMacTimeZonePrivate(
const QByteArray &ianaId);
317 ~QMacTimeZonePrivate();
319 QMacTimeZonePrivate *clone()
const override;
321 QString comment()
const override;
323 using QTimeZonePrivate::displayName;
324 QString displayName(QTimeZone::TimeType timeType, QTimeZone::NameType nameType,
325 const QLocale &locale)
const override;
326 QString abbreviation(qint64 atMSecsSinceEpoch)
const override;
328 int offsetFromUtc(qint64 atMSecsSinceEpoch)
const override;
329 int standardTimeOffset(qint64 atMSecsSinceEpoch)
const override;
330 int daylightTimeOffset(qint64 atMSecsSinceEpoch)
const override;
332 bool hasDaylightTime()
const override;
333 bool isDaylightTime(qint64 atMSecsSinceEpoch)
const override;
335 using QTimeZonePrivate::data;
336 Data data(qint64 forMSecsSinceEpoch)
const override;
338 bool hasTransitions()
const override;
339 Data nextTransition(qint64 afterMSecsSinceEpoch)
const override;
340 Data previousTransition(qint64 beforeMSecsSinceEpoch)
const override;
342 QByteArray systemTimeZoneId()
const override;
343 bool isTimeZoneIdAvailable(
const QByteArray &ianaId)
const override;
344 QList<QByteArray> availableTimeZoneIds()
const override;
346 NSTimeZone *nsTimeZone()
const;
349 void init(
const QByteArray &zoneId);
353#elif defined(Q_OS_ANDROID)
354class QAndroidTimeZonePrivate final :
public QTimeZonePrivate
356 QAndroidTimeZonePrivate &operator=(
const QAndroidTimeZonePrivate &)
const =
delete;
357 QAndroidTimeZonePrivate(
const QAndroidTimeZonePrivate &) =
default;
360 QAndroidTimeZonePrivate();
362 QAndroidTimeZonePrivate(
const QByteArray &ianaId);
363 ~QAndroidTimeZonePrivate();
365 QAndroidTimeZonePrivate *clone()
const override;
367 using QTimeZonePrivate::displayName;
368 QString displayName(QTimeZone::TimeType timeType, QTimeZone::NameType nameType,
369 const QLocale &locale)
const override;
370 QString abbreviation(qint64 atMSecsSinceEpoch)
const override;
372 int offsetFromUtc(qint64 atMSecsSinceEpoch)
const override;
373 int standardTimeOffset(qint64 atMSecsSinceEpoch)
const override;
374 int daylightTimeOffset(qint64 atMSecsSinceEpoch)
const override;
376 bool hasDaylightTime()
const override;
377 bool isDaylightTime(qint64 atMSecsSinceEpoch)
const override;
379 using QTimeZonePrivate::data;
380 Data data(qint64 forMSecsSinceEpoch)
const override;
382 QByteArray systemTimeZoneId()
const override;
383 bool isTimeZoneIdAvailable(
const QByteArray &ianaId)
const override;
384 QList<QByteArray> availableTimeZoneIds()
const override;
387 void init(
const QByteArray &zoneId);
389 QJniObject androidTimeZone;
391#elif defined(Q_OS_UNIX) && !defined(Q_OS_VXWORKS)
392struct QTzTransitionTime
394 qint64 atMSecsSinceEpoch;
397Q_DECLARE_TYPEINFO(QTzTransitionTime, Q_PRIMITIVE_TYPE);
398struct QTzTransitionRule
402 quint8 abbreviationIndex = 0;
404Q_DECLARE_TYPEINFO(QTzTransitionRule, Q_PRIMITIVE_TYPE);
405constexpr inline bool operator==(
const QTzTransitionRule &lhs,
const QTzTransitionRule &rhs)
noexcept
406{
return lhs.stdOffset == rhs.stdOffset && lhs.dstOffset == rhs.dstOffset && lhs.abbreviationIndex == rhs.abbreviationIndex; }
407constexpr inline bool operator!=(
const QTzTransitionRule &lhs,
const QTzTransitionRule &rhs)
noexcept
408{
return !operator==(lhs, rhs); }
412struct QTzTimeZoneCacheEntry
414 QList<QTzTransitionTime> m_tranTimes;
415 QList<QTzTransitionRule> m_tranRules;
416 QList<QByteArray> m_abbreviations;
417 QByteArray m_posixRule;
418 QTzTransitionRule m_preZoneRule;
419 bool m_hasDst =
false;
422class Q_AUTOTEST_EXPORT QTzTimeZonePrivate final :
public QTimeZonePrivate
424 QTzTimeZonePrivate &operator=(
const QTzTimeZonePrivate &)
const =
delete;
425 QTzTimeZonePrivate(
const QTzTimeZonePrivate &) =
default;
428 QTzTimeZonePrivate();
430 QTzTimeZonePrivate(
const QByteArray &ianaId);
431 ~QTzTimeZonePrivate();
433 QTzTimeZonePrivate *clone()
const override;
435 QLocale::Territory territory()
const override;
436 QString comment()
const override;
438 using QTimeZonePrivate::displayName;
439 QString displayName(QTimeZone::TimeType timeType,
440 QTimeZone::NameType nameType,
441 const QLocale &locale)
const override;
442 QString abbreviation(qint64 atMSecsSinceEpoch)
const override;
444 int offsetFromUtc(qint64 atMSecsSinceEpoch)
const override;
445 int standardTimeOffset(qint64 atMSecsSinceEpoch)
const override;
446 int daylightTimeOffset(qint64 atMSecsSinceEpoch)
const override;
448 bool hasDaylightTime()
const override;
449 bool isDaylightTime(qint64 atMSecsSinceEpoch)
const override;
451 Data data(qint64 forMSecsSinceEpoch)
const override;
452 Data data(QTimeZone::TimeType timeType)
const override;
453 bool isDataLocale(
const QLocale &locale)
const override;
455 bool hasTransitions()
const override;
456 Data nextTransition(qint64 afterMSecsSinceEpoch)
const override;
457 Data previousTransition(qint64 beforeMSecsSinceEpoch)
const override;
459 QByteArray systemTimeZoneId()
const override;
461 bool isTimeZoneIdAvailable(
const QByteArray &ianaId)
const override;
462 QList<QByteArray> availableTimeZoneIds()
const override;
463 QList<QByteArray> availableTimeZoneIds(QLocale::Territory territory)
const override;
466 static QByteArray staticSystemTimeZoneId();
467 QList<QTimeZonePrivate::Data> getPosixTransitions(qint64 msNear)
const;
469 Data dataForTzTransition(QTzTransitionTime tran)
const;
470 Data dataFromRule(QTzTransitionRule rule, qint64 msecsSinceEpoch)
const;
471 QTzTimeZoneCacheEntry cached_data;
472 const QList<QTzTransitionTime> &tranCache()
const {
return cached_data.m_tranTimes; }
475class Q_AUTOTEST_EXPORT QIcuTimeZonePrivate final :
public QTimeZonePrivate
477 QIcuTimeZonePrivate &operator=(
const QIcuTimeZonePrivate &)
const =
delete;
478 QIcuTimeZonePrivate(
const QIcuTimeZonePrivate &other);
481 QIcuTimeZonePrivate();
483 QIcuTimeZonePrivate(
const QByteArray &ianaId);
484 ~QIcuTimeZonePrivate();
486 QIcuTimeZonePrivate *clone()
const override;
488 using QTimeZonePrivate::displayName;
489 QString displayName(QTimeZone::TimeType timeType, QTimeZone::NameType nameType,
490 const QLocale &locale)
const override;
492 int offsetFromUtc(qint64 atMSecsSinceEpoch)
const override;
493 int standardTimeOffset(qint64 atMSecsSinceEpoch)
const override;
494 int daylightTimeOffset(qint64 atMSecsSinceEpoch)
const override;
496 bool hasDaylightTime()
const override;
497 bool isDaylightTime(qint64 atMSecsSinceEpoch)
const override;
499 using QTimeZonePrivate::data;
500 Data data(qint64 forMSecsSinceEpoch)
const override;
502 bool hasTransitions()
const override;
503 Data nextTransition(qint64 afterMSecsSinceEpoch)
const override;
504 Data previousTransition(qint64 beforeMSecsSinceEpoch)
const override;
506 QByteArray systemTimeZoneId()
const override;
508 bool isTimeZoneIdAvailable(
const QByteArray &ianaId)
const override;
509 QList<QByteArray> availableTimeZoneIds()
const override;
510 QList<QByteArray> availableTimeZoneIds(QLocale::Territory territory)
const override;
511 QList<QByteArray> availableTimeZoneIds(
int offsetFromUtc)
const override;
514 void init(
const QByteArray &ianaId);
518#elif defined(Q_OS_WIN)
519class Q_AUTOTEST_EXPORT QWinTimeZonePrivate final :
public QTimeZonePrivate
521 QWinTimeZonePrivate &operator=(
const QWinTimeZonePrivate &)
const =
delete;
522 QWinTimeZonePrivate(
const QWinTimeZonePrivate &) =
default;
524 struct QWinTransitionRule {
526 int standardTimeBias;
527 int daylightTimeBias;
528 SYSTEMTIME standardTimeRule;
529 SYSTEMTIME daylightTimeRule;
533 QWinTimeZonePrivate();
535 QWinTimeZonePrivate(
const QByteArray &ianaId);
536 ~QWinTimeZonePrivate();
538 QWinTimeZonePrivate *clone()
const override;
540 QString comment()
const override;
542 using QTimeZonePrivate::displayName;
543 QString displayName(QTimeZone::TimeType timeType, QTimeZone::NameType nameType,
544 const QLocale &locale)
const override;
545 QString abbreviation(qint64 atMSecsSinceEpoch)
const override;
547 int offsetFromUtc(qint64 atMSecsSinceEpoch)
const override;
548 int standardTimeOffset(qint64 atMSecsSinceEpoch)
const override;
549 int daylightTimeOffset(qint64 atMSecsSinceEpoch)
const override;
551 bool hasDaylightTime()
const override;
552 bool isDaylightTime(qint64 atMSecsSinceEpoch)
const override;
554 using QTimeZonePrivate::data;
555 Data data(qint64 forMSecsSinceEpoch)
const override;
557 bool hasTransitions()
const override;
558 Data nextTransition(qint64 afterMSecsSinceEpoch)
const override;
559 Data previousTransition(qint64 beforeMSecsSinceEpoch)
const override;
561 QByteArray systemTimeZoneId()
const override;
563 QList<QByteArray> availableTimeZoneIds()
const override;
566 QTimeZonePrivate::Data ruleToData(
const QWinTransitionRule &rule, qint64 atMSecsSinceEpoch,
567 QTimeZone::TimeType type,
bool fakeDst =
false)
const;
569 void init(
const QByteArray &ianaId);
571 QByteArray m_windowsId;
572 QString m_displayName;
573 QString m_standardName;
574 QString m_daylightName;
575 QList<QWinTransitionRule> m_tranRules;
static constexpr WindowsData windowsDataTable[]
static constexpr ZoneData zoneDataTable[]
Q_DECLARE_TYPEINFO(QObjectPrivate::ConnectionList, Q_RELOCATABLE_TYPE)
#define QStringLiteral(str)
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
QT_REQUIRE_CONFIG(timezone)