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 virtual bool isTimeZoneIdAvailable(
const QByteArray &ianaId)
const;
132 virtual QList<QByteArray> availableTimeZoneIds()
const = 0;
133 virtual QList<QByteArray> availableTimeZoneIds(QLocale::Territory territory)
const;
134 virtual QList<QByteArray> availableTimeZoneIds(
int utcOffset)
const;
136 virtual void serialize(QDataStream &ds)
const;
139 [[nodiscard]]
static constexpr qint64 maxMSecs()
140 {
return (std::numeric_limits<qint64>::max)(); }
141 [[nodiscard]]
static constexpr qint64 minMSecs()
142 {
return (std::numeric_limits<qint64>::min)() + 1; }
143 [[nodiscard]]
static constexpr qint64 invalidMSecs()
144 {
return (std::numeric_limits<qint64>::min)(); }
145 [[nodiscard]]
static constexpr int invalidSeconds()
146 {
return (std::numeric_limits<
int>::min)(); }
147 static QTimeZone::OffsetData invalidOffsetData();
148 static QTimeZone::OffsetData toOffsetData(
const Data &data);
149 static bool isValidId(
const QByteArray &ianaId);
150 static QString isoOffsetFormat(
int offsetFromUtc,
151 QTimeZone::NameType mode = QTimeZone::OffsetName);
153 static QByteArray aliasToIana(QByteArrayView alias);
154 static QByteArray ianaIdToWindowsId(
const QByteArray &ianaId);
155 static QByteArray windowsIdToDefaultIanaId(
const QByteArray &windowsId);
156 static QByteArray windowsIdToDefaultIanaId(
const QByteArray &windowsId,
157 QLocale::Territory territory);
158 static QList<QByteArray> windowsIdToIanaIds(
const QByteArray &windowsId);
159 static QList<QByteArray> windowsIdToIanaIds(
const QByteArray &windowsId,
160 QLocale::Territory territory);
161 struct NamePrefixMatch
164 qsizetype nameLength = 0;
165 QTimeZone::TimeType timeType = QTimeZone::GenericTime;
166 operator
bool()
const {
return nameLength > 0; }
168 static NamePrefixMatch findLongNamePrefix(QStringView text,
const QLocale &locale,
169 std::optional<qint64> atEpochMillis = std::nullopt);
170 static NamePrefixMatch findNarrowOffsetPrefix(QStringView text,
const QLocale &locale);
172 static NamePrefixMatch findLongUtcPrefix(QStringView text);
175 [[nodiscard]]
static inline QString utcQString()
177 return QStringLiteral(
"UTC");
180 [[nodiscard]]
static inline QByteArray utcQByteArray()
182 return QByteArrayLiteral(
"UTC");
185 [[nodiscard]]
static QTimeZone utcQTimeZone();
187#ifdef QT_BUILD_INTERNAL
188 [[nodiscard]]
static inline const QTimeZonePrivate *extractPrivate(
const QTimeZone &zone)
190 return zone.d.operator->();
197 QList<QByteArrayView> matchingTimeZoneIds(QLocale::Territory territory)
const;
198 QList<QByteArrayView> matchingTimeZoneIds(
int utcOffset)
const;
200#if QT_CONFIG(timezone_locale)
202 QString localeName(qint64 atMSecsSinceEpoch,
int offsetFromUtc,
203 QTimeZone::TimeType timeType,
204 QTimeZone::NameType nameType,
205 const QLocale &locale)
const;
212class Q_AUTOTEST_EXPORT QUtcTimeZonePrivate final :
public QTimeZonePrivate
214 QUtcTimeZonePrivate &operator=(
const QUtcTimeZonePrivate &)
const =
delete;
215 QUtcTimeZonePrivate(
const QUtcTimeZonePrivate &other);
218 QUtcTimeZonePrivate();
220 QUtcTimeZonePrivate(
const QByteArray &utcId);
222 QUtcTimeZonePrivate(qint32 offsetSeconds);
224 QUtcTimeZonePrivate(
const QByteArray &zoneId,
int offsetSeconds,
const QString &name,
225 const QString &abbreviation, QLocale::Territory territory,
226 const QString &comment);
227 virtual ~QUtcTimeZonePrivate();
230 static qint64 offsetFromUtcString(QByteArrayView id);
232 QUtcTimeZonePrivate *clone()
const override;
234 Data data(qint64 forMSecsSinceEpoch)
const override;
235 Data data(QTimeZone::TimeType timeType)
const override;
236 bool isDataLocale(
const QLocale &locale)
const override;
238 QLocale::Territory territory()
const override;
239 QString comment()
const override;
241 QString displayName(qint64 atMSecsSinceEpoch,
242 QTimeZone::NameType nameType,
243 const QLocale &locale)
const override;
244 QString displayName(QTimeZone::TimeType timeType,
245 QTimeZone::NameType nameType,
246 const QLocale &locale)
const override;
247 QString abbreviation(qint64 atMSecsSinceEpoch)
const override;
249 int standardTimeOffset(qint64 atMSecsSinceEpoch)
const override;
250 int daylightTimeOffset(qint64 atMSecsSinceEpoch)
const override;
252 QByteArray systemTimeZoneId()
const override;
254 bool isTimeZoneIdAvailable(
const QByteArray &ianaId)
const override;
255 QList<QByteArray> availableTimeZoneIds()
const override;
256 QList<QByteArray> availableTimeZoneIds(QLocale::Territory country)
const override;
257 QList<QByteArray> availableTimeZoneIds(
int utcOffset)
const override;
259 void serialize(QDataStream &ds)
const override;
262 void init(
const QByteArray &zoneId,
int offsetSeconds,
const QString &name,
263 const QString &abbreviation, QLocale::Territory territory,
264 const QString &comment);
267 QString m_abbreviation;
269 QLocale::Territory m_territory;
274#if QT_CONFIG(timezone_tzdb)
275class QChronoTimeZonePrivate final :
public QTimeZonePrivate
277 QChronoTimeZonePrivate &operator=(
const QChronoTimeZonePrivate &)
const =
delete;
278 QChronoTimeZonePrivate(
const QChronoTimeZonePrivate &) =
default;
280 QChronoTimeZonePrivate();
281 QChronoTimeZonePrivate(QByteArrayView id);
282 ~QChronoTimeZonePrivate() override;
283 QChronoTimeZonePrivate *clone()
const override;
285 QByteArray systemTimeZoneId()
const override;
287 QString abbreviation(qint64 atMSecsSinceEpoch)
const override;
288 int offsetFromUtc(qint64 atMSecsSinceEpoch)
const override;
289 int standardTimeOffset(qint64 atMSecsSinceEpoch)
const override;
290 int daylightTimeOffset(qint64 atMSecsSinceEpoch)
const override;
292 bool isTimeZoneIdAvailable(
const QByteArray &ianaId)
const override;
293 QList<QByteArray> availableTimeZoneIds()
const override;
294 QList<QByteArray> availableTimeZoneIds(
int utcOffset)
const override;
296 bool hasDaylightTime()
const override;
297 bool isDaylightTime(qint64 atMSecsSinceEpoch)
const override;
299 Data data(qint64 forMSecsSinceEpoch)
const override;
301 bool hasTransitions()
const override;
302 Data nextTransition(qint64 afterMSecsSinceEpoch)
const override;
303 Data previousTransition(qint64 beforeMSecsSinceEpoch)
const override;
306 const std::chrono::time_zone *
const m_timeZone;
308#elif defined(Q_OS_DARWIN)
309class Q_AUTOTEST_EXPORT QMacTimeZonePrivate final :
public QTimeZonePrivate
311 QMacTimeZonePrivate &operator=(
const QMacTimeZonePrivate &)
const =
delete;
312 QMacTimeZonePrivate(
const QMacTimeZonePrivate &other);
315 QMacTimeZonePrivate();
317 QMacTimeZonePrivate(
const QByteArray &ianaId);
318 ~QMacTimeZonePrivate();
320 QMacTimeZonePrivate *clone()
const override;
322 QString comment()
const override;
324 using QTimeZonePrivate::displayName;
325 QString displayName(QTimeZone::TimeType timeType, QTimeZone::NameType nameType,
326 const QLocale &locale)
const override;
327 QString abbreviation(qint64 atMSecsSinceEpoch)
const override;
329 int offsetFromUtc(qint64 atMSecsSinceEpoch)
const override;
330 int standardTimeOffset(qint64 atMSecsSinceEpoch)
const override;
331 int daylightTimeOffset(qint64 atMSecsSinceEpoch)
const override;
333 bool hasDaylightTime()
const override;
334 bool isDaylightTime(qint64 atMSecsSinceEpoch)
const override;
336 using QTimeZonePrivate::data;
337 Data data(qint64 forMSecsSinceEpoch)
const override;
339 bool hasTransitions()
const override;
340 Data nextTransition(qint64 afterMSecsSinceEpoch)
const override;
341 Data previousTransition(qint64 beforeMSecsSinceEpoch)
const override;
343 QByteArray systemTimeZoneId()
const override;
344 bool isTimeZoneIdAvailable(
const QByteArray &ianaId)
const override;
345 QList<QByteArray> availableTimeZoneIds()
const override;
347 NSTimeZone *nsTimeZone()
const;
350 void init(
const QByteArray &zoneId);
354#elif defined(Q_OS_ANDROID)
355class QAndroidTimeZonePrivate final :
public QTimeZonePrivate
357 QAndroidTimeZonePrivate &operator=(
const QAndroidTimeZonePrivate &)
const =
delete;
358 QAndroidTimeZonePrivate(
const QAndroidTimeZonePrivate &) =
default;
361 QAndroidTimeZonePrivate();
363 QAndroidTimeZonePrivate(
const QByteArray &ianaId);
364 ~QAndroidTimeZonePrivate();
366 QAndroidTimeZonePrivate *clone()
const override;
368 using QTimeZonePrivate::displayName;
369 QString displayName(QTimeZone::TimeType timeType, QTimeZone::NameType nameType,
370 const QLocale &locale)
const override;
371 QString abbreviation(qint64 atMSecsSinceEpoch)
const override;
373 int offsetFromUtc(qint64 atMSecsSinceEpoch)
const override;
374 int standardTimeOffset(qint64 atMSecsSinceEpoch)
const override;
375 int daylightTimeOffset(qint64 atMSecsSinceEpoch)
const override;
377 bool hasDaylightTime()
const override;
378 bool isDaylightTime(qint64 atMSecsSinceEpoch)
const override;
380 using QTimeZonePrivate::data;
381 Data data(qint64 forMSecsSinceEpoch)
const override;
383 QByteArray systemTimeZoneId()
const override;
384 bool isTimeZoneIdAvailable(
const QByteArray &ianaId)
const override;
385 QList<QByteArray> availableTimeZoneIds()
const override;
388 void init(
const QByteArray &zoneId);
390 QJniObject androidTimeZone;
392#elif defined(Q_OS_UNIX) && !defined(Q_OS_VXWORKS)
393struct QTzTransitionTime
395 qint64 atMSecsSinceEpoch;
398Q_DECLARE_TYPEINFO(QTzTransitionTime, Q_PRIMITIVE_TYPE);
399struct QTzTransitionRule
403 quint8 abbreviationIndex = 0;
405Q_DECLARE_TYPEINFO(QTzTransitionRule, Q_PRIMITIVE_TYPE);
406constexpr inline bool operator==(
const QTzTransitionRule &lhs,
const QTzTransitionRule &rhs)
noexcept
407{
return lhs.stdOffset == rhs.stdOffset && lhs.dstOffset == rhs.dstOffset && lhs.abbreviationIndex == rhs.abbreviationIndex; }
408constexpr inline bool operator!=(
const QTzTransitionRule &lhs,
const QTzTransitionRule &rhs)
noexcept
409{
return !operator==(lhs, rhs); }
413struct QTzTimeZoneCacheEntry
415 QList<QTzTransitionTime> m_tranTimes;
416 QList<QTzTransitionRule> m_tranRules;
417 QList<QByteArray> m_abbreviations;
418 QByteArray m_posixRule;
419 QTzTransitionRule m_preZoneRule;
420 bool m_hasDst =
false;
423class Q_AUTOTEST_EXPORT QTzTimeZonePrivate final :
public QTimeZonePrivate
425 QTzTimeZonePrivate &operator=(
const QTzTimeZonePrivate &)
const =
delete;
426 QTzTimeZonePrivate(
const QTzTimeZonePrivate &) =
default;
429 QTzTimeZonePrivate();
431 QTzTimeZonePrivate(
const QByteArray &ianaId);
432 ~QTzTimeZonePrivate();
434 QTzTimeZonePrivate *clone()
const override;
436 QLocale::Territory territory()
const override;
437 QString comment()
const override;
439 using QTimeZonePrivate::displayName;
440 QString displayName(QTimeZone::TimeType timeType,
441 QTimeZone::NameType nameType,
442 const QLocale &locale)
const override;
443 QString abbreviation(qint64 atMSecsSinceEpoch)
const override;
445 int offsetFromUtc(qint64 atMSecsSinceEpoch)
const override;
446 int standardTimeOffset(qint64 atMSecsSinceEpoch)
const override;
447 int daylightTimeOffset(qint64 atMSecsSinceEpoch)
const override;
449 bool hasDaylightTime()
const override;
450 bool isDaylightTime(qint64 atMSecsSinceEpoch)
const override;
452 Data data(qint64 forMSecsSinceEpoch)
const override;
453 Data data(QTimeZone::TimeType timeType)
const override;
454 bool isDataLocale(
const QLocale &locale)
const override;
456 bool hasTransitions()
const override;
457 Data nextTransition(qint64 afterMSecsSinceEpoch)
const override;
458 Data previousTransition(qint64 beforeMSecsSinceEpoch)
const override;
460 QByteArray systemTimeZoneId()
const override;
462 bool isTimeZoneIdAvailable(
const QByteArray &ianaId)
const override;
463 QList<QByteArray> availableTimeZoneIds()
const override;
464 QList<QByteArray> availableTimeZoneIds(QLocale::Territory territory)
const override;
467 static QByteArray staticSystemTimeZoneId();
468 QList<QTimeZonePrivate::Data> getPosixTransitions(qint64 msNear)
const;
470 Data dataForTzTransition(QTzTransitionTime tran)
const;
471 Data dataFromRule(QTzTransitionRule rule, qint64 msecsSinceEpoch)
const;
472 QTzTimeZoneCacheEntry cached_data;
473 const QList<QTzTransitionTime> &tranCache()
const {
return cached_data.m_tranTimes; }
476class Q_AUTOTEST_EXPORT QIcuTimeZonePrivate final :
public QTimeZonePrivate
478 QIcuTimeZonePrivate &operator=(
const QIcuTimeZonePrivate &)
const =
delete;
479 QIcuTimeZonePrivate(
const QIcuTimeZonePrivate &other);
482 QIcuTimeZonePrivate();
484 QIcuTimeZonePrivate(
const QByteArray &ianaId);
485 ~QIcuTimeZonePrivate();
487 QIcuTimeZonePrivate *clone()
const override;
489 using QTimeZonePrivate::displayName;
490 QString displayName(QTimeZone::TimeType timeType, QTimeZone::NameType nameType,
491 const QLocale &locale)
const override;
493 int offsetFromUtc(qint64 atMSecsSinceEpoch)
const override;
494 int standardTimeOffset(qint64 atMSecsSinceEpoch)
const override;
495 int daylightTimeOffset(qint64 atMSecsSinceEpoch)
const override;
497 bool hasDaylightTime()
const override;
498 bool isDaylightTime(qint64 atMSecsSinceEpoch)
const override;
500 using QTimeZonePrivate::data;
501 Data data(qint64 forMSecsSinceEpoch)
const override;
503 bool hasTransitions()
const override;
504 Data nextTransition(qint64 afterMSecsSinceEpoch)
const override;
505 Data previousTransition(qint64 beforeMSecsSinceEpoch)
const override;
507 QByteArray systemTimeZoneId()
const override;
509 bool isTimeZoneIdAvailable(
const QByteArray &ianaId)
const override;
510 QList<QByteArray> availableTimeZoneIds()
const override;
511 QList<QByteArray> availableTimeZoneIds(QLocale::Territory territory)
const override;
512 QList<QByteArray> availableTimeZoneIds(
int offsetFromUtc)
const override;
515 void init(
const QByteArray &ianaId);
519#elif defined(Q_OS_WIN)
520class Q_AUTOTEST_EXPORT QWinTimeZonePrivate final :
public QTimeZonePrivate
522 QWinTimeZonePrivate &operator=(
const QWinTimeZonePrivate &)
const =
delete;
523 QWinTimeZonePrivate(
const QWinTimeZonePrivate &) =
default;
525 struct QWinTransitionRule {
527 int standardTimeBias;
528 int daylightTimeBias;
529 SYSTEMTIME standardTimeRule;
530 SYSTEMTIME daylightTimeRule;
534 QWinTimeZonePrivate();
536 QWinTimeZonePrivate(
const QByteArray &ianaId);
537 ~QWinTimeZonePrivate();
539 QWinTimeZonePrivate *clone()
const override;
541 QString comment()
const override;
543 using QTimeZonePrivate::displayName;
544 QString displayName(QTimeZone::TimeType timeType, QTimeZone::NameType nameType,
545 const QLocale &locale)
const override;
546 QString abbreviation(qint64 atMSecsSinceEpoch)
const override;
548 int offsetFromUtc(qint64 atMSecsSinceEpoch)
const override;
549 int standardTimeOffset(qint64 atMSecsSinceEpoch)
const override;
550 int daylightTimeOffset(qint64 atMSecsSinceEpoch)
const override;
552 bool hasDaylightTime()
const override;
553 bool isDaylightTime(qint64 atMSecsSinceEpoch)
const override;
555 using QTimeZonePrivate::data;
556 Data data(qint64 forMSecsSinceEpoch)
const override;
558 bool hasTransitions()
const override;
559 Data nextTransition(qint64 afterMSecsSinceEpoch)
const override;
560 Data previousTransition(qint64 beforeMSecsSinceEpoch)
const override;
562 QByteArray systemTimeZoneId()
const override;
564 QList<QByteArray> availableTimeZoneIds()
const override;
567 QTimeZonePrivate::Data ruleToData(
const QWinTransitionRule &rule, qint64 atMSecsSinceEpoch,
568 QTimeZone::TimeType type,
bool fakeDst =
false)
const;
570 void init(
const QByteArray &ianaId);
572 QByteArray m_windowsId;
573 QString m_displayName;
574 QString m_standardName;
575 QString m_daylightName;
576 QList<QWinTransitionRule> m_tranRules;
static constexpr WindowsData windowsDataTable[]
static constexpr ZoneData zoneDataTable[]
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 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)