Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qtimezoneprivate_p.h
Go to the documentation of this file.
1// Copyright (C) 2022 The Qt Company Ltd.
2// Copyright (C) 2013 John Layt <jlayt@kde.org>
3// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
4
5
6#ifndef QTIMEZONEPRIVATE_P_H
7#define QTIMEZONEPRIVATE_P_H
8
9//
10// W A R N I N G
11// -------------
12//
13// This file is not part of the Qt API. It exists for the convenience
14// of internal files. This header file may change from version to version
15// without notice, or even be removed.
16//
17// We mean it.
18//
19
20#include "qlist.h"
21#include "qtimezone.h"
22#include "private/qlocale_p.h"
23#include "private/qdatetime_p.h"
24
25#if QT_CONFIG(timezone_tzdb)
26#include <chrono>
27#endif
28
29#if QT_CONFIG(icu)
30#include <unicode/ucal.h>
31#endif
32
33#ifdef Q_OS_DARWIN
35#endif // Q_OS_DARWIN
36
37#ifdef Q_OS_WIN
38#include <qt_windows.h>
39#endif // Q_OS_WIN
40
41#ifdef Q_OS_ANDROID
42#include <QJniObject>
43#endif
44
47
48class Q_AUTOTEST_EXPORT QTimeZonePrivate : public QSharedData
49{
50 // Nothing should be copy-assigning instances of either this or its derived
51 // classes (only clone() should copy, using the copy-constructor):
52 bool operator=(const QTimeZonePrivate &) const = delete;
53protected:
54 QTimeZonePrivate(const QTimeZonePrivate &other) = default;
55public:
56 // Version of QTimeZone::OffsetData struct using msecs for efficiency
57 struct Data {
58 QString abbreviation;
59 qint64 atMSecsSinceEpoch;
60 int offsetFromUtc;
61 int standardTimeOffset;
62 int daylightTimeOffset;
63 Data()
64 : atMSecsSinceEpoch(QTimeZonePrivate::invalidMSecs()),
65 offsetFromUtc(QTimeZonePrivate::invalidSeconds()),
66 standardTimeOffset(QTimeZonePrivate::invalidSeconds()),
67 daylightTimeOffset(QTimeZonePrivate::invalidSeconds())
68 {}
69 Data(const QString &name, qint64 when, int offset, int standard)
70 : abbreviation(name),
71 atMSecsSinceEpoch(when),
72 offsetFromUtc(offset),
73 standardTimeOffset(standard),
74 daylightTimeOffset(offset - standard)
75 {}
76 };
77 typedef QList<Data> DataList;
78
79 // Create null time zone
80 QTimeZonePrivate();
81 virtual ~QTimeZonePrivate();
82
83 virtual QTimeZonePrivate *clone() const = 0;
84
85 bool operator==(const QTimeZonePrivate &other) const;
86 bool operator!=(const QTimeZonePrivate &other) const;
87
88 bool isValid() const;
89
90 QByteArray id() const;
91 virtual QLocale::Territory territory() const;
92 virtual QString comment() const;
93
94 virtual QString displayName(qint64 atMSecsSinceEpoch,
95 QTimeZone::NameType nameType,
96 const QLocale &locale) const;
97 virtual QString displayName(QTimeZone::TimeType timeType,
98 QTimeZone::NameType nameType,
99 const QLocale &locale) const;
100 virtual QString abbreviation(qint64 atMSecsSinceEpoch) const;
101
102 virtual int offsetFromUtc(qint64 atMSecsSinceEpoch) const;
103 virtual int standardTimeOffset(qint64 atMSecsSinceEpoch) const;
104 virtual int daylightTimeOffset(qint64 atMSecsSinceEpoch) const;
105
106 virtual bool hasDaylightTime() const;
107 virtual bool isDaylightTime(qint64 atMSecsSinceEpoch) const;
108
109 virtual Data data(qint64 forMSecsSinceEpoch) const;
110 virtual Data data(QTimeZone::TimeType timeType) const;
111 virtual bool isDataLocale(const QLocale &locale) const;
112 QDateTimePrivate::ZoneState stateAtZoneTime(qint64 forLocalMSecs,
113 QDateTimePrivate::TransitionOptions resolve) const;
114
115 virtual bool hasTransitions() const;
116 virtual Data nextTransition(qint64 afterMSecsSinceEpoch) const;
117 virtual Data previousTransition(qint64 beforeMSecsSinceEpoch) const;
118 DataList transitions(qint64 fromMSecsSinceEpoch, qint64 toMSecsSinceEpoch) const;
119
120 virtual QByteArray systemTimeZoneId() const;
121
122 virtual bool isTimeZoneIdAvailable(const QByteArray &ianaId) const;
123 virtual QList<QByteArray> availableTimeZoneIds() const = 0;
124 virtual QList<QByteArray> availableTimeZoneIds(QLocale::Territory territory) const;
125 virtual QList<QByteArray> availableTimeZoneIds(int utcOffset) const;
126
127 virtual void serialize(QDataStream &ds) const;
128
129 // Static Utility Methods
130 [[nodiscard]] static constexpr qint64 maxMSecs()
131 { return (std::numeric_limits<qint64>::max)(); }
132 [[nodiscard]] static constexpr qint64 minMSecs()
133 { return (std::numeric_limits<qint64>::min)() + 1; }
134 [[nodiscard]] static constexpr qint64 invalidMSecs()
135 { return (std::numeric_limits<qint64>::min)(); }
136 [[nodiscard]] static constexpr int invalidSeconds()
137 { return (std::numeric_limits<int>::min)(); }
138 static QTimeZone::OffsetData invalidOffsetData();
139 static QTimeZone::OffsetData toOffsetData(const Data &data);
140 static bool isValidId(const QByteArray &ianaId);
141 static QString isoOffsetFormat(int offsetFromUtc,
142 QTimeZone::NameType mode = QTimeZone::OffsetName);
143
144 static QByteArray aliasToIana(QByteArrayView alias);
145 static QByteArray ianaIdToWindowsId(const QByteArray &ianaId);
146 static QByteArray windowsIdToDefaultIanaId(const QByteArray &windowsId);
147 static QByteArray windowsIdToDefaultIanaId(const QByteArray &windowsId,
148 QLocale::Territory territory);
149 static QList<QByteArray> windowsIdToIanaIds(const QByteArray &windowsId);
150 static QList<QByteArray> windowsIdToIanaIds(const QByteArray &windowsId,
151 QLocale::Territory territory);
152
153 // returns "UTC" QString and QByteArray
154 [[nodiscard]] static inline QString utcQString()
155 {
156 return QStringLiteral("UTC");
157 }
158
159 [[nodiscard]] static inline QByteArray utcQByteArray()
160 {
161 return QByteArrayLiteral("UTC");
162 }
163
164protected:
165 // Zones CLDR data says match a condition.
166 // Use to filter what the backend has available.
167 QList<QByteArrayView> matchingTimeZoneIds(QLocale::Territory territory) const;
168 QList<QByteArrayView> matchingTimeZoneIds(int utcOffset) const;
169
170#if QT_CONFIG(timezone_locale)
171 // Defined in qtimezonelocale.cpp
172 QString localeName(qint64 atMSecsSinceEpoch, int offsetFromUtc,
173 QTimeZone::TimeType timeType,
174 QTimeZone::NameType nameType,
175 const QLocale &locale) const;
176#endif // L10n helpers.
177
178 QByteArray m_id;
179};
181
182template<> QTimeZonePrivate *QSharedDataPointer<QTimeZonePrivate>::clone();
183
184class Q_AUTOTEST_EXPORT QUtcTimeZonePrivate final : public QTimeZonePrivate
185{
186 bool operator=(const QUtcTimeZonePrivate &) const = delete;
187 QUtcTimeZonePrivate(const QUtcTimeZonePrivate &other);
188public:
189 // Create default UTC time zone
190 QUtcTimeZonePrivate();
191 // Create named time zone
192 QUtcTimeZonePrivate(const QByteArray &utcId);
193 // Create offset from UTC
194 QUtcTimeZonePrivate(qint32 offsetSeconds);
195 // Create custom offset from UTC
196 QUtcTimeZonePrivate(const QByteArray &zoneId, int offsetSeconds, const QString &name,
197 const QString &abbreviation, QLocale::Territory territory,
198 const QString &comment);
199 virtual ~QUtcTimeZonePrivate();
200
201 // Fall-back for UTC[+-]\d+(:\d+){,2} IDs.
202 static qint64 offsetFromUtcString(QByteArrayView id);
203
204 QUtcTimeZonePrivate *clone() const override;
205
206 Data data(qint64 forMSecsSinceEpoch) const override;
207 Data data(QTimeZone::TimeType timeType) const override;
208 bool isDataLocale(const QLocale &locale) const override;
209
210 QLocale::Territory territory() const override;
211 QString comment() const override;
212
213 QString displayName(qint64 atMSecsSinceEpoch,
214 QTimeZone::NameType nameType,
215 const QLocale &locale) const override;
216 QString displayName(QTimeZone::TimeType timeType,
217 QTimeZone::NameType nameType,
218 const QLocale &locale) const override;
219 QString abbreviation(qint64 atMSecsSinceEpoch) const override;
220
221 int standardTimeOffset(qint64 atMSecsSinceEpoch) const override;
222 int daylightTimeOffset(qint64 atMSecsSinceEpoch) const override;
223
224 QByteArray systemTimeZoneId() const override;
225
226 bool isTimeZoneIdAvailable(const QByteArray &ianaId) const override;
227 QList<QByteArray> availableTimeZoneIds() const override;
228 QList<QByteArray> availableTimeZoneIds(QLocale::Territory country) const override;
229 QList<QByteArray> availableTimeZoneIds(int utcOffset) const override;
230
231 void serialize(QDataStream &ds) const override;
232
233private:
234 void init(const QByteArray &zoneId, int offsetSeconds, const QString &name,
235 const QString &abbreviation, QLocale::Territory territory,
236 const QString &comment);
237
238 QString m_name;
239 QString m_abbreviation;
240 QString m_comment;
241 QLocale::Territory m_territory;
242 int m_offsetFromUtc;
243};
244
245// Platform backend cascade: match newBackendTimeZone() in qtimezone.cpp
246#if QT_CONFIG(timezone_tzdb)
247class QChronoTimeZonePrivate final : public QTimeZonePrivate
248{
249 bool operator=(const QChronoTimeZonePrivate &) const = delete;
250 QChronoTimeZonePrivate(const QChronoTimeZonePrivate &) = default;
251public:
252 QChronoTimeZonePrivate();
253 QChronoTimeZonePrivate(QByteArrayView id);
254 ~QChronoTimeZonePrivate() override;
255 QChronoTimeZonePrivate *clone() const override;
256
257 QByteArray systemTimeZoneId() const override;
258
259 QString abbreviation(qint64 atMSecsSinceEpoch) const override;
260 int offsetFromUtc(qint64 atMSecsSinceEpoch) const override;
261 int standardTimeOffset(qint64 atMSecsSinceEpoch) const override;
262 int daylightTimeOffset(qint64 atMSecsSinceEpoch) const override;
263
264 bool isTimeZoneIdAvailable(const QByteArray &ianaId) const override;
265 QList<QByteArray> availableTimeZoneIds() const override;
266 QList<QByteArray> availableTimeZoneIds(int utcOffset) const override;
267
268 bool hasDaylightTime() const override;
269 bool isDaylightTime(qint64 atMSecsSinceEpoch) const override;
270
271 Data data(qint64 forMSecsSinceEpoch) const override;
272
273 bool hasTransitions() const override;
274 Data nextTransition(qint64 afterMSecsSinceEpoch) const override;
275 Data previousTransition(qint64 beforeMSecsSinceEpoch) const override;
276
277private:
278 const std::chrono::time_zone *const m_timeZone;
279};
280#elif defined(Q_OS_DARWIN)
281class Q_AUTOTEST_EXPORT QMacTimeZonePrivate final : public QTimeZonePrivate
282{
283 bool operator=(const QMacTimeZonePrivate &) const = delete;
284 QMacTimeZonePrivate(const QMacTimeZonePrivate &other);
285public:
286 // Create default time zone
287 QMacTimeZonePrivate();
288 // Create named time zone
289 QMacTimeZonePrivate(const QByteArray &ianaId);
290 ~QMacTimeZonePrivate();
291
292 QMacTimeZonePrivate *clone() const override;
293
294 QString comment() const override;
295
296 using QTimeZonePrivate::displayName;
297 QString displayName(QTimeZone::TimeType timeType, QTimeZone::NameType nameType,
298 const QLocale &locale) const override;
299 QString abbreviation(qint64 atMSecsSinceEpoch) const override;
300
301 int offsetFromUtc(qint64 atMSecsSinceEpoch) const override;
302 int standardTimeOffset(qint64 atMSecsSinceEpoch) const override;
303 int daylightTimeOffset(qint64 atMSecsSinceEpoch) const override;
304
305 bool hasDaylightTime() const override;
306 bool isDaylightTime(qint64 atMSecsSinceEpoch) const override;
307
308 using QTimeZonePrivate::data;
309 Data data(qint64 forMSecsSinceEpoch) const override;
310
311 bool hasTransitions() const override;
312 Data nextTransition(qint64 afterMSecsSinceEpoch) const override;
313 Data previousTransition(qint64 beforeMSecsSinceEpoch) const override;
314
315 QByteArray systemTimeZoneId() const override;
316 bool isTimeZoneIdAvailable(const QByteArray &ianaId) const override;
317 QList<QByteArray> availableTimeZoneIds() const override;
318
319 NSTimeZone *nsTimeZone() const;
320
321private:
322 void init(const QByteArray &zoneId);
323
324 NSTimeZone *m_nstz;
325};
326#elif defined(Q_OS_ANDROID)
327class QAndroidTimeZonePrivate final : public QTimeZonePrivate
328{
329 bool operator=(const QAndroidTimeZonePrivate &) const = delete;
330 QAndroidTimeZonePrivate(const QAndroidTimeZonePrivate &) = default;
331public:
332 // Create default time zone
333 QAndroidTimeZonePrivate();
334 // Create named time zone
335 QAndroidTimeZonePrivate(const QByteArray &ianaId);
336 ~QAndroidTimeZonePrivate();
337
338 QAndroidTimeZonePrivate *clone() const override;
339
340 using QTimeZonePrivate::displayName;
341 QString displayName(QTimeZone::TimeType timeType, QTimeZone::NameType nameType,
342 const QLocale &locale) const override;
343 QString abbreviation(qint64 atMSecsSinceEpoch) const override;
344
345 int offsetFromUtc(qint64 atMSecsSinceEpoch) const override;
346 int standardTimeOffset(qint64 atMSecsSinceEpoch) const override;
347 int daylightTimeOffset(qint64 atMSecsSinceEpoch) const override;
348
349 bool hasDaylightTime() const override;
350 bool isDaylightTime(qint64 atMSecsSinceEpoch) const override;
351
352 using QTimeZonePrivate::data;
353 Data data(qint64 forMSecsSinceEpoch) const override;
354
355 QByteArray systemTimeZoneId() const override;
356 bool isTimeZoneIdAvailable(const QByteArray &ianaId) const override;
357 QList<QByteArray> availableTimeZoneIds() const override;
358
359private:
360 void init(const QByteArray &zoneId);
361
362 QJniObject androidTimeZone;
363};
364#elif defined(Q_OS_UNIX)
365struct QTzTransitionTime
366{
367 qint64 atMSecsSinceEpoch;
368 quint8 ruleIndex;
369};
370Q_DECLARE_TYPEINFO(QTzTransitionTime, Q_PRIMITIVE_TYPE);
371struct QTzTransitionRule
372{
373 int stdOffset = 0;
374 int dstOffset = 0;
375 quint8 abbreviationIndex = 0;
376};
377Q_DECLARE_TYPEINFO(QTzTransitionRule, Q_PRIMITIVE_TYPE);
378constexpr inline bool operator==(const QTzTransitionRule &lhs, const QTzTransitionRule &rhs) noexcept
379{ return lhs.stdOffset == rhs.stdOffset && lhs.dstOffset == rhs.dstOffset && lhs.abbreviationIndex == rhs.abbreviationIndex; }
380constexpr inline bool operator!=(const QTzTransitionRule &lhs, const QTzTransitionRule &rhs) noexcept
381{ return !operator==(lhs, rhs); }
382
383// These are stored separately from QTzTimeZonePrivate so that they can be
384// cached, avoiding the need to re-parse them from disk constantly.
385struct QTzTimeZoneCacheEntry
386{
387 QList<QTzTransitionTime> m_tranTimes;
388 QList<QTzTransitionRule> m_tranRules;
389 QList<QByteArray> m_abbreviations;
390 QByteArray m_posixRule;
391 QTzTransitionRule m_preZoneRule;
392 bool m_hasDst = false;
393};
394
395class Q_AUTOTEST_EXPORT QTzTimeZonePrivate final : public QTimeZonePrivate
396{
397 bool operator=(const QTzTimeZonePrivate &) const = delete;
398 QTzTimeZonePrivate(const QTzTimeZonePrivate &) = default;
399public:
400 // Create default time zone
401 QTzTimeZonePrivate();
402 // Create named time zone
403 QTzTimeZonePrivate(const QByteArray &ianaId);
404 ~QTzTimeZonePrivate();
405
406 QTzTimeZonePrivate *clone() const override;
407
408 QLocale::Territory territory() const override;
409 QString comment() const override;
410
411 using QTimeZonePrivate::displayName;
412 QString displayName(QTimeZone::TimeType timeType,
413 QTimeZone::NameType nameType,
414 const QLocale &locale) const override;
415 QString abbreviation(qint64 atMSecsSinceEpoch) const override;
416
417 int offsetFromUtc(qint64 atMSecsSinceEpoch) const override;
418 int standardTimeOffset(qint64 atMSecsSinceEpoch) const override;
419 int daylightTimeOffset(qint64 atMSecsSinceEpoch) const override;
420
421 bool hasDaylightTime() const override;
422 bool isDaylightTime(qint64 atMSecsSinceEpoch) const override;
423
424 Data data(qint64 forMSecsSinceEpoch) const override;
425 Data data(QTimeZone::TimeType timeType) const override;
426 bool isDataLocale(const QLocale &locale) const override;
427
428 bool hasTransitions() const override;
429 Data nextTransition(qint64 afterMSecsSinceEpoch) const override;
430 Data previousTransition(qint64 beforeMSecsSinceEpoch) const override;
431
432 QByteArray systemTimeZoneId() const override;
433
434 bool isTimeZoneIdAvailable(const QByteArray &ianaId) const override;
435 QList<QByteArray> availableTimeZoneIds() const override;
436 QList<QByteArray> availableTimeZoneIds(QLocale::Territory territory) const override;
437
438private:
439 static QByteArray staticSystemTimeZoneId();
440 QList<QTimeZonePrivate::Data> getPosixTransitions(qint64 msNear) const;
441
442 Data dataForTzTransition(QTzTransitionTime tran) const;
443 Data dataFromRule(QTzTransitionRule rule, qint64 msecsSinceEpoch) const;
444 QTzTimeZoneCacheEntry cached_data;
445 const QList<QTzTransitionTime> &tranCache() const { return cached_data.m_tranTimes; }
446};
447#elif QT_CONFIG(icu)
448class Q_AUTOTEST_EXPORT QIcuTimeZonePrivate final : public QTimeZonePrivate
449{
450 bool operator=(const QIcuTimeZonePrivate &) const = delete;
451 QIcuTimeZonePrivate(const QIcuTimeZonePrivate &other);
452public:
453 // Create default time zone
454 QIcuTimeZonePrivate();
455 // Create named time zone
456 QIcuTimeZonePrivate(const QByteArray &ianaId);
457 ~QIcuTimeZonePrivate();
458
459 QIcuTimeZonePrivate *clone() const override;
460
461 using QTimeZonePrivate::displayName;
462 QString displayName(QTimeZone::TimeType timeType, QTimeZone::NameType nameType,
463 const QLocale &locale) const override;
464
465 int offsetFromUtc(qint64 atMSecsSinceEpoch) const override;
466 int standardTimeOffset(qint64 atMSecsSinceEpoch) const override;
467 int daylightTimeOffset(qint64 atMSecsSinceEpoch) const override;
468
469 bool hasDaylightTime() const override;
470 bool isDaylightTime(qint64 atMSecsSinceEpoch) const override;
471
472 using QTimeZonePrivate::data;
473 Data data(qint64 forMSecsSinceEpoch) const override;
474
475 bool hasTransitions() const override;
476 Data nextTransition(qint64 afterMSecsSinceEpoch) const override;
477 Data previousTransition(qint64 beforeMSecsSinceEpoch) const override;
478
479 QByteArray systemTimeZoneId() const override;
480
481 bool isTimeZoneIdAvailable(const QByteArray &ianaId) const override;
482 QList<QByteArray> availableTimeZoneIds() const override;
483 QList<QByteArray> availableTimeZoneIds(QLocale::Territory territory) const override;
484 QList<QByteArray> availableTimeZoneIds(int offsetFromUtc) const override;
485
486private:
487 void init(const QByteArray &ianaId);
488
489 UCalendar *m_ucal;
490};
491#elif defined(Q_OS_WIN)
492class Q_AUTOTEST_EXPORT QWinTimeZonePrivate final : public QTimeZonePrivate
493{
494 bool operator=(const QWinTimeZonePrivate &) const = delete;
495 QWinTimeZonePrivate(const QWinTimeZonePrivate &) = default;
496public:
497 struct QWinTransitionRule {
498 int startYear;
499 int standardTimeBias;
500 int daylightTimeBias;
501 SYSTEMTIME standardTimeRule;
502 SYSTEMTIME daylightTimeRule;
503 };
504
505 // Create default time zone
506 QWinTimeZonePrivate();
507 // Create named time zone
508 QWinTimeZonePrivate(const QByteArray &ianaId);
509 ~QWinTimeZonePrivate();
510
511 QWinTimeZonePrivate *clone() const override;
512
513 QString comment() const override;
514
515 using QTimeZonePrivate::displayName;
516 QString displayName(QTimeZone::TimeType timeType, QTimeZone::NameType nameType,
517 const QLocale &locale) const override;
518 QString abbreviation(qint64 atMSecsSinceEpoch) const override;
519
520 int offsetFromUtc(qint64 atMSecsSinceEpoch) const override;
521 int standardTimeOffset(qint64 atMSecsSinceEpoch) const override;
522 int daylightTimeOffset(qint64 atMSecsSinceEpoch) const override;
523
524 bool hasDaylightTime() const override;
525 bool isDaylightTime(qint64 atMSecsSinceEpoch) const override;
526
527 using QTimeZonePrivate::data;
528 Data data(qint64 forMSecsSinceEpoch) const override;
529
530 bool hasTransitions() const override;
531 Data nextTransition(qint64 afterMSecsSinceEpoch) const override;
532 Data previousTransition(qint64 beforeMSecsSinceEpoch) const override;
533
534 QByteArray systemTimeZoneId() const override;
535
536 QList<QByteArray> availableTimeZoneIds() const override;
537
538 // For use within implementation's TransitionTimePair:
539 QTimeZonePrivate::Data ruleToData(const QWinTransitionRule &rule, qint64 atMSecsSinceEpoch,
540 QTimeZone::TimeType type, bool fakeDst = false) const;
541private:
542 void init(const QByteArray &ianaId);
543
544 QByteArray m_windowsId;
545 QString m_displayName;
546 QString m_standardName;
547 QString m_daylightName;
548 QList<QWinTransitionRule> m_tranRules;
549};
550#endif // C++20, Darwin, Android, Unix, ICU, Win.
551
552QT_END_NAMESPACE
553
554#endif // QTIMEZONEPRIVATE_P_H
Definition qlist.h:80
static constexpr WindowsData windowsDataTable[]
static constexpr ZoneData zoneDataTable[]
Definition qcompare.h:76
QT_REQUIRE_CONFIG(animation)
Q_DECLARE_TYPEINFO(QObjectPrivate::ConnectionList, Q_RELOCATABLE_TYPE)
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