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// Qt-Security score:significant reason:default
5
6
7#ifndef QTIMEZONEPRIVATE_P_H
8#define QTIMEZONEPRIVATE_P_H
9
10//
11// W A R N I N G
12// -------------
13//
14// This file is not part of the Qt API. It exists for the convenience
15// of internal files. This header file may change from version to version
16// without notice, or even be removed.
17//
18// We mean it.
19//
20
21#include "qlist.h"
22#include "qtimezone.h"
23#include "private/qlocale_p.h"
24#include "private/qdatetime_p.h"
25
26#if QT_CONFIG(timezone_tzdb)
27#include <chrono>
28#endif
29#include <optional>
30
31#if QT_CONFIG(icu)
32#include <unicode/ucal.h>
33#endif
34
35#ifdef Q_OS_DARWIN
36Q_FORWARD_DECLARE_OBJC_CLASS(NSTimeZone);
37#endif // Q_OS_DARWIN
38
39#ifdef Q_OS_WIN
40#include <qt_windows.h>
41#endif // Q_OS_WIN
42
43#ifdef Q_OS_ANDROID
44#include <QJniObject>
45#endif
46
49
50class Q_AUTOTEST_EXPORT QTimeZonePrivate : public QSharedData
51{
52 // Nothing should be copy-assigning instances of either this or its derived
53 // classes (only clone() should copy, using the copy-constructor):
54 QTimeZonePrivate &operator=(const QTimeZonePrivate &) const = delete;
55protected:
56 QTimeZonePrivate(const QTimeZonePrivate &other) = default;
57public:
58 // Version of QTimeZone::OffsetData struct using msecs for efficiency
59 struct Data {
60 QString abbreviation;
61 qint64 atMSecsSinceEpoch;
62 int offsetFromUtc;
63 int standardTimeOffset;
64 int daylightTimeOffset;
65 Data()
66 : atMSecsSinceEpoch(QTimeZonePrivate::invalidMSecs()),
67 offsetFromUtc(QTimeZonePrivate::invalidSeconds()),
68 standardTimeOffset(QTimeZonePrivate::invalidSeconds()),
69 daylightTimeOffset(QTimeZonePrivate::invalidSeconds())
70 {}
71 Data(const QString &name, qint64 when, int offset, int standard)
72 : abbreviation(name),
73 atMSecsSinceEpoch(when),
74 offsetFromUtc(offset),
75 standardTimeOffset(standard),
76 daylightTimeOffset(offset - standard)
77 {}
78 };
79 typedef QList<Data> DataList;
80
81 // Create null time zone
82 QTimeZonePrivate();
83 virtual ~QTimeZonePrivate();
84
85 virtual QTimeZonePrivate *clone() const = 0;
86
87 bool operator==(const QTimeZonePrivate &other) const;
88 bool operator!=(const QTimeZonePrivate &other) const;
89
90 bool isValid() const;
91
92 QByteArray id() const;
93 virtual QLocale::Territory territory() const;
94 virtual QString comment() const;
95
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;
103
104 virtual int offsetFromUtc(qint64 atMSecsSinceEpoch) const;
105 virtual int standardTimeOffset(qint64 atMSecsSinceEpoch) const;
106 virtual int daylightTimeOffset(qint64 atMSecsSinceEpoch) const;
107
108 virtual bool hasDaylightTime() const;
109 virtual bool isDaylightTime(qint64 atMSecsSinceEpoch) const;
110
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)
115 {
116 // Sufficiently like the C locale for displayName()-related purposes:
117 const QLocale::Language lang = locale.language();
118 return lang == QLocale::C
119 || (lang == QLocale::English && locale.script() == QLocale::LatinScript);
120 }
121 QDateTimePrivate::ZoneState stateAtZoneTime(qint64 forLocalMSecs,
122 QDateTimePrivate::TransitionOptions resolve) const;
123
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;
128
129 virtual QByteArray systemTimeZoneId() const;
130
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;
135
136 virtual void serialize(QDataStream &ds) const;
137
138 // Static Utility Methods
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);
152
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
162 {
163 QByteArray ianaId;
164 qsizetype nameLength = 0;
165 QTimeZone::TimeType timeType = QTimeZone::GenericTime;
166 operator bool() const { return nameLength > 0; }
167 };
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);
171 // Match the unlocalized long form of QUtcTimeZonePrivate:
172 static NamePrefixMatch findLongUtcPrefix(QStringView text);
173
174 // returns "UTC" QString and QByteArray
175 [[nodiscard]] static inline QString utcQString()
176 {
177 return QStringLiteral("UTC");
178 }
179
180 [[nodiscard]] static inline QByteArray utcQByteArray()
181 {
182 return QByteArrayLiteral("UTC");
183 }
184
185 [[nodiscard]] static QTimeZone utcQTimeZone();
186
187#ifdef QT_BUILD_INTERNAL // For the benefit of a test
188 [[nodiscard]] static inline const QTimeZonePrivate *extractPrivate(const QTimeZone &zone)
189 {
190 return zone.d.operator->();
191 }
192#endif
193
194protected:
195 // Zones CLDR data says match a condition.
196 // Use to filter what the backend has available.
197 QList<QByteArrayView> matchingTimeZoneIds(QLocale::Territory territory) const;
198 QList<QByteArrayView> matchingTimeZoneIds(int utcOffset) const;
199
200#if QT_CONFIG(timezone_locale)
201 // Defined in qtimezonelocale.cpp
202 QString localeName(qint64 atMSecsSinceEpoch, int offsetFromUtc,
203 QTimeZone::TimeType timeType,
204 QTimeZone::NameType nameType,
205 const QLocale &locale) const;
206#endif // L10n helpers.
207
208 QByteArray m_id;
209};
211
212class Q_AUTOTEST_EXPORT QUtcTimeZonePrivate final : public QTimeZonePrivate
213{
214 QUtcTimeZonePrivate &operator=(const QUtcTimeZonePrivate &) const = delete;
215 QUtcTimeZonePrivate(const QUtcTimeZonePrivate &other);
216public:
217 // Create default UTC time zone
218 QUtcTimeZonePrivate();
219 // Create named time zone
220 QUtcTimeZonePrivate(const QByteArray &utcId);
221 // Create offset from UTC
222 QUtcTimeZonePrivate(qint32 offsetSeconds);
223 // Create custom offset from UTC
224 QUtcTimeZonePrivate(const QByteArray &zoneId, int offsetSeconds, const QString &name,
225 const QString &abbreviation, QLocale::Territory territory,
226 const QString &comment);
227 virtual ~QUtcTimeZonePrivate();
228
229 // Fall-back for UTC[+-]\d+(:\d+){,2} IDs.
230 static qint64 offsetFromUtcString(QByteArrayView id);
231
232 QUtcTimeZonePrivate *clone() const override;
233
234 Data data(qint64 forMSecsSinceEpoch) const override;
235 Data data(QTimeZone::TimeType timeType) const override;
236 bool isDataLocale(const QLocale &locale) const override;
237
238 QLocale::Territory territory() const override;
239 QString comment() const override;
240
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;
248
249 int standardTimeOffset(qint64 atMSecsSinceEpoch) const override;
250 int daylightTimeOffset(qint64 atMSecsSinceEpoch) const override;
251
252 QByteArray systemTimeZoneId() const override;
253
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;
258
259 void serialize(QDataStream &ds) const override;
260
261private:
262 void init(const QByteArray &zoneId, int offsetSeconds, const QString &name,
263 const QString &abbreviation, QLocale::Territory territory,
264 const QString &comment);
265
266 QString m_name;
267 QString m_abbreviation;
268 QString m_comment;
269 QLocale::Territory m_territory;
270 int m_offsetFromUtc;
271};
272
273// Platform backend cascade: match newBackendTimeZone() in qtimezone.cpp
274#if QT_CONFIG(timezone_tzdb)
275class QChronoTimeZonePrivate final : public QTimeZonePrivate
276{
277 QChronoTimeZonePrivate &operator=(const QChronoTimeZonePrivate &) const = delete;
278 QChronoTimeZonePrivate(const QChronoTimeZonePrivate &) = default;
279public:
280 QChronoTimeZonePrivate();
281 QChronoTimeZonePrivate(QByteArrayView id);
282 ~QChronoTimeZonePrivate() override;
283 QChronoTimeZonePrivate *clone() const override;
284
285 QByteArray systemTimeZoneId() const override;
286
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;
291
292 bool isTimeZoneIdAvailable(const QByteArray &ianaId) const override;
293 QList<QByteArray> availableTimeZoneIds() const override;
294 QList<QByteArray> availableTimeZoneIds(int utcOffset) const override;
295
296 bool hasDaylightTime() const override;
297 bool isDaylightTime(qint64 atMSecsSinceEpoch) const override;
298
299 Data data(qint64 forMSecsSinceEpoch) const override;
300
301 bool hasTransitions() const override;
302 Data nextTransition(qint64 afterMSecsSinceEpoch) const override;
303 Data previousTransition(qint64 beforeMSecsSinceEpoch) const override;
304
305private:
306 const std::chrono::time_zone *const m_timeZone;
307};
308#elif defined(Q_OS_DARWIN)
309class Q_AUTOTEST_EXPORT QMacTimeZonePrivate final : public QTimeZonePrivate
310{
311 QMacTimeZonePrivate &operator=(const QMacTimeZonePrivate &) const = delete;
312 QMacTimeZonePrivate(const QMacTimeZonePrivate &other);
313public:
314 // Create default time zone
315 QMacTimeZonePrivate();
316 // Create named time zone
317 QMacTimeZonePrivate(const QByteArray &ianaId);
318 ~QMacTimeZonePrivate();
319
320 QMacTimeZonePrivate *clone() const override;
321
322 QString comment() const override;
323
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;
328
329 int offsetFromUtc(qint64 atMSecsSinceEpoch) const override;
330 int standardTimeOffset(qint64 atMSecsSinceEpoch) const override;
331 int daylightTimeOffset(qint64 atMSecsSinceEpoch) const override;
332
333 bool hasDaylightTime() const override;
334 bool isDaylightTime(qint64 atMSecsSinceEpoch) const override;
335
336 using QTimeZonePrivate::data;
337 Data data(qint64 forMSecsSinceEpoch) const override;
338
339 bool hasTransitions() const override;
340 Data nextTransition(qint64 afterMSecsSinceEpoch) const override;
341 Data previousTransition(qint64 beforeMSecsSinceEpoch) const override;
342
343 QByteArray systemTimeZoneId() const override;
344 bool isTimeZoneIdAvailable(const QByteArray &ianaId) const override;
345 QList<QByteArray> availableTimeZoneIds() const override;
346
347 NSTimeZone *nsTimeZone() const;
348
349private:
350 void init(const QByteArray &zoneId);
351
352 NSTimeZone *m_nstz;
353};
354#elif defined(Q_OS_ANDROID)
355class QAndroidTimeZonePrivate final : public QTimeZonePrivate
356{
357 QAndroidTimeZonePrivate &operator=(const QAndroidTimeZonePrivate &) const = delete;
358 QAndroidTimeZonePrivate(const QAndroidTimeZonePrivate &) = default;
359public:
360 // Create default time zone
361 QAndroidTimeZonePrivate();
362 // Create named time zone
363 QAndroidTimeZonePrivate(const QByteArray &ianaId);
364 ~QAndroidTimeZonePrivate();
365
366 QAndroidTimeZonePrivate *clone() const override;
367
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;
372
373 int offsetFromUtc(qint64 atMSecsSinceEpoch) const override;
374 int standardTimeOffset(qint64 atMSecsSinceEpoch) const override;
375 int daylightTimeOffset(qint64 atMSecsSinceEpoch) const override;
376
377 bool hasDaylightTime() const override;
378 bool isDaylightTime(qint64 atMSecsSinceEpoch) const override;
379
380 using QTimeZonePrivate::data;
381 Data data(qint64 forMSecsSinceEpoch) const override;
382
383 QByteArray systemTimeZoneId() const override;
384 bool isTimeZoneIdAvailable(const QByteArray &ianaId) const override;
385 QList<QByteArray> availableTimeZoneIds() const override;
386
387private:
388 void init(const QByteArray &zoneId);
389
390 QJniObject androidTimeZone;
391};
392#elif defined(Q_OS_UNIX) && !defined(Q_OS_VXWORKS)
393struct QTzTransitionTime
394{
395 qint64 atMSecsSinceEpoch;
396 quint8 ruleIndex;
397};
398Q_DECLARE_TYPEINFO(QTzTransitionTime, Q_PRIMITIVE_TYPE);
399struct QTzTransitionRule
400{
401 int stdOffset = 0;
402 int dstOffset = 0;
403 quint8 abbreviationIndex = 0;
404};
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); }
410
411// These are stored separately from QTzTimeZonePrivate so that they can be
412// cached, avoiding the need to re-parse them from disk constantly.
413struct QTzTimeZoneCacheEntry
414{
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;
421};
422
423class Q_AUTOTEST_EXPORT QTzTimeZonePrivate final : public QTimeZonePrivate
424{
425 QTzTimeZonePrivate &operator=(const QTzTimeZonePrivate &) const = delete;
426 QTzTimeZonePrivate(const QTzTimeZonePrivate &) = default;
427public:
428 // Create default time zone
429 QTzTimeZonePrivate();
430 // Create named time zone
431 QTzTimeZonePrivate(const QByteArray &ianaId);
432 ~QTzTimeZonePrivate();
433
434 QTzTimeZonePrivate *clone() const override;
435
436 QLocale::Territory territory() const override;
437 QString comment() const override;
438
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;
444
445 int offsetFromUtc(qint64 atMSecsSinceEpoch) const override;
446 int standardTimeOffset(qint64 atMSecsSinceEpoch) const override;
447 int daylightTimeOffset(qint64 atMSecsSinceEpoch) const override;
448
449 bool hasDaylightTime() const override;
450 bool isDaylightTime(qint64 atMSecsSinceEpoch) const override;
451
452 Data data(qint64 forMSecsSinceEpoch) const override;
453 Data data(QTimeZone::TimeType timeType) const override;
454 bool isDataLocale(const QLocale &locale) const override;
455
456 bool hasTransitions() const override;
457 Data nextTransition(qint64 afterMSecsSinceEpoch) const override;
458 Data previousTransition(qint64 beforeMSecsSinceEpoch) const override;
459
460 QByteArray systemTimeZoneId() const override;
461
462 bool isTimeZoneIdAvailable(const QByteArray &ianaId) const override;
463 QList<QByteArray> availableTimeZoneIds() const override;
464 QList<QByteArray> availableTimeZoneIds(QLocale::Territory territory) const override;
465
466private:
467 static QByteArray staticSystemTimeZoneId();
468 QList<QTimeZonePrivate::Data> getPosixTransitions(qint64 msNear) const;
469
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; }
474};
475#elif QT_CONFIG(icu)
476class Q_AUTOTEST_EXPORT QIcuTimeZonePrivate final : public QTimeZonePrivate
477{
478 QIcuTimeZonePrivate &operator=(const QIcuTimeZonePrivate &) const = delete;
479 QIcuTimeZonePrivate(const QIcuTimeZonePrivate &other);
480public:
481 // Create default time zone
482 QIcuTimeZonePrivate();
483 // Create named time zone
484 QIcuTimeZonePrivate(const QByteArray &ianaId);
485 ~QIcuTimeZonePrivate();
486
487 QIcuTimeZonePrivate *clone() const override;
488
489 using QTimeZonePrivate::displayName;
490 QString displayName(QTimeZone::TimeType timeType, QTimeZone::NameType nameType,
491 const QLocale &locale) const override;
492
493 int offsetFromUtc(qint64 atMSecsSinceEpoch) const override;
494 int standardTimeOffset(qint64 atMSecsSinceEpoch) const override;
495 int daylightTimeOffset(qint64 atMSecsSinceEpoch) const override;
496
497 bool hasDaylightTime() const override;
498 bool isDaylightTime(qint64 atMSecsSinceEpoch) const override;
499
500 using QTimeZonePrivate::data;
501 Data data(qint64 forMSecsSinceEpoch) const override;
502
503 bool hasTransitions() const override;
504 Data nextTransition(qint64 afterMSecsSinceEpoch) const override;
505 Data previousTransition(qint64 beforeMSecsSinceEpoch) const override;
506
507 QByteArray systemTimeZoneId() const override;
508
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;
513
514private:
515 void init(const QByteArray &ianaId);
516
517 UCalendar *m_ucal;
518};
519#elif defined(Q_OS_WIN)
520class Q_AUTOTEST_EXPORT QWinTimeZonePrivate final : public QTimeZonePrivate
521{
522 QWinTimeZonePrivate &operator=(const QWinTimeZonePrivate &) const = delete;
523 QWinTimeZonePrivate(const QWinTimeZonePrivate &) = default;
524public:
525 struct QWinTransitionRule {
526 int startYear;
527 int standardTimeBias;
528 int daylightTimeBias;
529 SYSTEMTIME standardTimeRule;
530 SYSTEMTIME daylightTimeRule;
531 };
532
533 // Create default time zone
534 QWinTimeZonePrivate();
535 // Create named time zone
536 QWinTimeZonePrivate(const QByteArray &ianaId);
537 ~QWinTimeZonePrivate();
538
539 QWinTimeZonePrivate *clone() const override;
540
541 QString comment() const override;
542
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;
547
548 int offsetFromUtc(qint64 atMSecsSinceEpoch) const override;
549 int standardTimeOffset(qint64 atMSecsSinceEpoch) const override;
550 int daylightTimeOffset(qint64 atMSecsSinceEpoch) const override;
551
552 bool hasDaylightTime() const override;
553 bool isDaylightTime(qint64 atMSecsSinceEpoch) const override;
554
555 using QTimeZonePrivate::data;
556 Data data(qint64 forMSecsSinceEpoch) const override;
557
558 bool hasTransitions() const override;
559 Data nextTransition(qint64 afterMSecsSinceEpoch) const override;
560 Data previousTransition(qint64 beforeMSecsSinceEpoch) const override;
561
562 QByteArray systemTimeZoneId() const override;
563
564 QList<QByteArray> availableTimeZoneIds() const override;
565
566 // For use within implementation's TransitionTimePair:
567 QTimeZonePrivate::Data ruleToData(const QWinTransitionRule &rule, qint64 atMSecsSinceEpoch,
568 QTimeZone::TimeType type, bool fakeDst = false) const;
569private:
570 void init(const QByteArray &ianaId);
571
572 QByteArray m_windowsId;
573 QString m_displayName;
574 QString m_standardName;
575 QString m_daylightName;
576 QList<QWinTransitionRule> m_tranRules;
577};
578#endif // C++20, Darwin, Android, Unix, ICU, Win.
579
580QT_END_NAMESPACE
581
582#endif // QTIMEZONEPRIVATE_P_H
Definition qlist.h:81
static constexpr WindowsData windowsDataTable[]
static constexpr ZoneData zoneDataTable[]
Definition qcompare.h:111
Q_DECLARE_TYPEINFO(QDateTime::Data, Q_RELOCATABLE_TYPE)
#define QStringLiteral(str)
Definition qstring.h:1825
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)