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 bool 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() {
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,
170 QLocale::FormatType scale);
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;
212template<> QTimeZonePrivate *QSharedDataPointer<QTimeZonePrivate>::clone();
214class Q_AUTOTEST_EXPORT QUtcTimeZonePrivate final :
public QTimeZonePrivate
216 bool operator=(
const QUtcTimeZonePrivate &)
const =
delete;
217 QUtcTimeZonePrivate(
const QUtcTimeZonePrivate &other);
220 QUtcTimeZonePrivate();
222 QUtcTimeZonePrivate(
const QByteArray &utcId);
224 QUtcTimeZonePrivate(qint32 offsetSeconds);
226 QUtcTimeZonePrivate(
const QByteArray &zoneId,
int offsetSeconds,
const QString &name,
227 const QString &abbreviation, QLocale::Territory territory,
228 const QString &comment);
229 virtual ~QUtcTimeZonePrivate();
232 static qint64 offsetFromUtcString(QByteArrayView id);
234 QUtcTimeZonePrivate *clone()
const override;
236 Data data(qint64 forMSecsSinceEpoch)
const override;
237 Data data(QTimeZone::TimeType timeType)
const override;
238 bool isDataLocale(
const QLocale &locale)
const override;
240 QLocale::Territory territory()
const override;
241 QString comment()
const override;
243 QString displayName(qint64 atMSecsSinceEpoch,
244 QTimeZone::NameType nameType,
245 const QLocale &locale)
const override;
246 QString displayName(QTimeZone::TimeType timeType,
247 QTimeZone::NameType nameType,
248 const QLocale &locale)
const override;
249 QString abbreviation(qint64 atMSecsSinceEpoch)
const override;
251 int standardTimeOffset(qint64 atMSecsSinceEpoch)
const override;
252 int daylightTimeOffset(qint64 atMSecsSinceEpoch)
const override;
254 QByteArray systemTimeZoneId()
const override;
256 bool isTimeZoneIdAvailable(
const QByteArray &ianaId)
const override;
257 QList<QByteArray> availableTimeZoneIds()
const override;
258 QList<QByteArray> availableTimeZoneIds(QLocale::Territory country)
const override;
259 QList<QByteArray> availableTimeZoneIds(
int utcOffset)
const override;
261 void serialize(QDataStream &ds)
const override;
264 void init(
const QByteArray &zoneId,
int offsetSeconds,
const QString &name,
265 const QString &abbreviation, QLocale::Territory territory,
266 const QString &comment);
269 QString m_abbreviation;
271 QLocale::Territory m_territory;
276#if QT_CONFIG(timezone_tzdb)
277class QChronoTimeZonePrivate final :
public QTimeZonePrivate
279 bool operator=(
const QChronoTimeZonePrivate &)
const =
delete;
280 QChronoTimeZonePrivate(
const QChronoTimeZonePrivate &) =
default;
282 QChronoTimeZonePrivate();
283 QChronoTimeZonePrivate(QByteArrayView id);
284 ~QChronoTimeZonePrivate() override;
285 QChronoTimeZonePrivate *clone()
const override;
287 QByteArray systemTimeZoneId()
const override;
289 QString abbreviation(qint64 atMSecsSinceEpoch)
const override;
290 int offsetFromUtc(qint64 atMSecsSinceEpoch)
const override;
291 int standardTimeOffset(qint64 atMSecsSinceEpoch)
const override;
292 int daylightTimeOffset(qint64 atMSecsSinceEpoch)
const override;
294 bool isTimeZoneIdAvailable(
const QByteArray &ianaId)
const override;
295 QList<QByteArray> availableTimeZoneIds()
const override;
296 QList<QByteArray> availableTimeZoneIds(
int utcOffset)
const override;
298 bool hasDaylightTime()
const override;
299 bool isDaylightTime(qint64 atMSecsSinceEpoch)
const override;
301 Data data(qint64 forMSecsSinceEpoch)
const override;
303 bool hasTransitions()
const override;
304 Data nextTransition(qint64 afterMSecsSinceEpoch)
const override;
305 Data previousTransition(qint64 beforeMSecsSinceEpoch)
const override;
308 const std::chrono::time_zone *
const m_timeZone;
310#elif defined(Q_OS_DARWIN)
311class Q_AUTOTEST_EXPORT QMacTimeZonePrivate final :
public QTimeZonePrivate
313 bool operator=(
const QMacTimeZonePrivate &)
const =
delete;
314 QMacTimeZonePrivate(
const QMacTimeZonePrivate &other);
317 QMacTimeZonePrivate();
319 QMacTimeZonePrivate(
const QByteArray &ianaId);
320 ~QMacTimeZonePrivate();
322 QMacTimeZonePrivate *clone()
const override;
324 QString comment()
const override;
326 using QTimeZonePrivate::displayName;
327 QString displayName(QTimeZone::TimeType timeType, QTimeZone::NameType nameType,
328 const QLocale &locale)
const override;
329 QString abbreviation(qint64 atMSecsSinceEpoch)
const override;
331 int offsetFromUtc(qint64 atMSecsSinceEpoch)
const override;
332 int standardTimeOffset(qint64 atMSecsSinceEpoch)
const override;
333 int daylightTimeOffset(qint64 atMSecsSinceEpoch)
const override;
335 bool hasDaylightTime()
const override;
336 bool isDaylightTime(qint64 atMSecsSinceEpoch)
const override;
338 using QTimeZonePrivate::data;
339 Data data(qint64 forMSecsSinceEpoch)
const override;
341 bool hasTransitions()
const override;
342 Data nextTransition(qint64 afterMSecsSinceEpoch)
const override;
343 Data previousTransition(qint64 beforeMSecsSinceEpoch)
const override;
345 QByteArray systemTimeZoneId()
const override;
346 bool isTimeZoneIdAvailable(
const QByteArray &ianaId)
const override;
347 QList<QByteArray> availableTimeZoneIds()
const override;
349 NSTimeZone *nsTimeZone()
const;
352 void init(
const QByteArray &zoneId);
356#elif defined(Q_OS_ANDROID)
357class QAndroidTimeZonePrivate final :
public QTimeZonePrivate
359 bool operator=(
const QAndroidTimeZonePrivate &)
const =
delete;
360 QAndroidTimeZonePrivate(
const QAndroidTimeZonePrivate &) =
default;
363 QAndroidTimeZonePrivate();
365 QAndroidTimeZonePrivate(
const QByteArray &ianaId);
366 ~QAndroidTimeZonePrivate();
368 QAndroidTimeZonePrivate *clone()
const override;
370 using QTimeZonePrivate::displayName;
371 QString displayName(QTimeZone::TimeType timeType, QTimeZone::NameType nameType,
372 const QLocale &locale)
const override;
373 QString abbreviation(qint64 atMSecsSinceEpoch)
const override;
375 int offsetFromUtc(qint64 atMSecsSinceEpoch)
const override;
376 int standardTimeOffset(qint64 atMSecsSinceEpoch)
const override;
377 int daylightTimeOffset(qint64 atMSecsSinceEpoch)
const override;
379 bool hasDaylightTime()
const override;
380 bool isDaylightTime(qint64 atMSecsSinceEpoch)
const override;
382 using QTimeZonePrivate::data;
383 Data data(qint64 forMSecsSinceEpoch)
const override;
385 QByteArray systemTimeZoneId()
const override;
386 bool isTimeZoneIdAvailable(
const QByteArray &ianaId)
const override;
387 QList<QByteArray> availableTimeZoneIds()
const override;
390 void init(
const QByteArray &zoneId);
392 QJniObject androidTimeZone;
394#elif defined(Q_OS_UNIX)
395struct QTzTransitionTime
397 qint64 atMSecsSinceEpoch;
400Q_DECLARE_TYPEINFO(QTzTransitionTime, Q_PRIMITIVE_TYPE);
401struct QTzTransitionRule
405 quint8 abbreviationIndex = 0;
407Q_DECLARE_TYPEINFO(QTzTransitionRule, Q_PRIMITIVE_TYPE);
408constexpr inline bool operator==(
const QTzTransitionRule &lhs,
const QTzTransitionRule &rhs)
noexcept
409{
return lhs.stdOffset == rhs.stdOffset && lhs.dstOffset == rhs.dstOffset && lhs.abbreviationIndex == rhs.abbreviationIndex; }
410constexpr inline bool operator!=(
const QTzTransitionRule &lhs,
const QTzTransitionRule &rhs)
noexcept
411{
return !operator==(lhs, rhs); }
415struct QTzTimeZoneCacheEntry
417 QList<QTzTransitionTime> m_tranTimes;
418 QList<QTzTransitionRule> m_tranRules;
419 QList<QByteArray> m_abbreviations;
420 QByteArray m_posixRule;
421 QTzTransitionRule m_preZoneRule;
422 bool m_hasDst =
false;
425class Q_AUTOTEST_EXPORT QTzTimeZonePrivate final :
public QTimeZonePrivate
427 bool operator=(
const QTzTimeZonePrivate &)
const =
delete;
428 QTzTimeZonePrivate(
const QTzTimeZonePrivate &) =
default;
431 QTzTimeZonePrivate();
433 QTzTimeZonePrivate(
const QByteArray &ianaId);
434 ~QTzTimeZonePrivate();
436 QTzTimeZonePrivate *clone()
const override;
438 QLocale::Territory territory()
const override;
439 QString comment()
const override;
441 using QTimeZonePrivate::displayName;
442 QString displayName(QTimeZone::TimeType timeType,
443 QTimeZone::NameType nameType,
444 const QLocale &locale)
const override;
445 QString abbreviation(qint64 atMSecsSinceEpoch)
const override;
447 int offsetFromUtc(qint64 atMSecsSinceEpoch)
const override;
448 int standardTimeOffset(qint64 atMSecsSinceEpoch)
const override;
449 int daylightTimeOffset(qint64 atMSecsSinceEpoch)
const override;
451 bool hasDaylightTime()
const override;
452 bool isDaylightTime(qint64 atMSecsSinceEpoch)
const override;
454 Data data(qint64 forMSecsSinceEpoch)
const override;
455 Data data(QTimeZone::TimeType timeType)
const override;
456 bool isDataLocale(
const QLocale &locale)
const override;
458 bool hasTransitions()
const override;
459 Data nextTransition(qint64 afterMSecsSinceEpoch)
const override;
460 Data previousTransition(qint64 beforeMSecsSinceEpoch)
const override;
462 QByteArray systemTimeZoneId()
const override;
464 bool isTimeZoneIdAvailable(
const QByteArray &ianaId)
const override;
465 QList<QByteArray> availableTimeZoneIds()
const override;
466 QList<QByteArray> availableTimeZoneIds(QLocale::Territory territory)
const override;
469 static QByteArray staticSystemTimeZoneId();
470 QList<QTimeZonePrivate::Data> getPosixTransitions(qint64 msNear)
const;
472 Data dataForTzTransition(QTzTransitionTime tran)
const;
473 Data dataFromRule(QTzTransitionRule rule, qint64 msecsSinceEpoch)
const;
474 QTzTimeZoneCacheEntry cached_data;
475 const QList<QTzTransitionTime> &tranCache()
const {
return cached_data.m_tranTimes; }
478class Q_AUTOTEST_EXPORT QIcuTimeZonePrivate final :
public QTimeZonePrivate
480 bool operator=(
const QIcuTimeZonePrivate &)
const =
delete;
481 QIcuTimeZonePrivate(
const QIcuTimeZonePrivate &other);
484 QIcuTimeZonePrivate();
486 QIcuTimeZonePrivate(
const QByteArray &ianaId);
487 ~QIcuTimeZonePrivate();
489 QIcuTimeZonePrivate *clone()
const override;
491 using QTimeZonePrivate::displayName;
492 QString displayName(QTimeZone::TimeType timeType, QTimeZone::NameType nameType,
493 const QLocale &locale)
const override;
495 int offsetFromUtc(qint64 atMSecsSinceEpoch)
const override;
496 int standardTimeOffset(qint64 atMSecsSinceEpoch)
const override;
497 int daylightTimeOffset(qint64 atMSecsSinceEpoch)
const override;
499 bool hasDaylightTime()
const override;
500 bool isDaylightTime(qint64 atMSecsSinceEpoch)
const override;
502 using QTimeZonePrivate::data;
503 Data data(qint64 forMSecsSinceEpoch)
const override;
505 bool hasTransitions()
const override;
506 Data nextTransition(qint64 afterMSecsSinceEpoch)
const override;
507 Data previousTransition(qint64 beforeMSecsSinceEpoch)
const override;
509 QByteArray systemTimeZoneId()
const override;
511 bool isTimeZoneIdAvailable(
const QByteArray &ianaId)
const override;
512 QList<QByteArray> availableTimeZoneIds()
const override;
513 QList<QByteArray> availableTimeZoneIds(QLocale::Territory territory)
const override;
514 QList<QByteArray> availableTimeZoneIds(
int offsetFromUtc)
const override;
517 void init(
const QByteArray &ianaId);
521#elif defined(Q_OS_WIN)
522class Q_AUTOTEST_EXPORT QWinTimeZonePrivate final :
public QTimeZonePrivate
524 bool operator=(
const QWinTimeZonePrivate &)
const =
delete;
525 QWinTimeZonePrivate(
const QWinTimeZonePrivate &) =
default;
527 struct QWinTransitionRule {
529 int standardTimeBias;
530 int daylightTimeBias;
531 SYSTEMTIME standardTimeRule;
532 SYSTEMTIME daylightTimeRule;
536 QWinTimeZonePrivate();
538 QWinTimeZonePrivate(
const QByteArray &ianaId);
539 ~QWinTimeZonePrivate();
541 QWinTimeZonePrivate *clone()
const override;
543 QString comment()
const override;
545 using QTimeZonePrivate::displayName;
546 QString displayName(QTimeZone::TimeType timeType, QTimeZone::NameType nameType,
547 const QLocale &locale)
const override;
548 QString abbreviation(qint64 atMSecsSinceEpoch)
const override;
550 int offsetFromUtc(qint64 atMSecsSinceEpoch)
const override;
551 int standardTimeOffset(qint64 atMSecsSinceEpoch)
const override;
552 int daylightTimeOffset(qint64 atMSecsSinceEpoch)
const override;
554 bool hasDaylightTime()
const override;
555 bool isDaylightTime(qint64 atMSecsSinceEpoch)
const override;
557 using QTimeZonePrivate::data;
558 Data data(qint64 forMSecsSinceEpoch)
const override;
560 bool hasTransitions()
const override;
561 Data nextTransition(qint64 afterMSecsSinceEpoch)
const override;
562 Data previousTransition(qint64 beforeMSecsSinceEpoch)
const override;
564 QByteArray systemTimeZoneId()
const override;
566 QList<QByteArray> availableTimeZoneIds()
const override;
569 QTimeZonePrivate::Data ruleToData(
const QWinTransitionRule &rule, qint64 atMSecsSinceEpoch,
570 QTimeZone::TimeType type,
bool fakeDst =
false)
const;
572 void init(
const QByteArray &ianaId);
574 QByteArray m_windowsId;
575 QString m_displayName;
576 QString m_standardName;
577 QString m_daylightName;
578 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)