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 QByteArrayView availableAlias(QByteArrayView ianaId) const; // Empty if none.
132 virtual bool isTimeZoneIdAvailable(QByteArrayView ianaId) const;
133 virtual QList<QByteArray> availableTimeZoneIds() const = 0;
134 virtual QList<QByteArray> availableTimeZoneIds(QLocale::Territory territory) const;
135 virtual QList<QByteArray> availableTimeZoneIds(int utcOffset) const;
136
137 virtual void serialize(QDataStream &ds) const;
138
139 // Static Utility Methods
140 [[nodiscard]] static constexpr qint64 maxMSecs()
141 { return (std::numeric_limits<qint64>::max)(); }
142 [[nodiscard]] static constexpr qint64 minMSecs()
143 { return (std::numeric_limits<qint64>::min)() + 1; }
144 [[nodiscard]] static constexpr qint64 invalidMSecs()
145 { return (std::numeric_limits<qint64>::min)(); }
146 [[nodiscard]] static constexpr int invalidSeconds()
147 { return (std::numeric_limits<int>::min)(); }
148 static QTimeZone::OffsetData invalidOffsetData();
149 static QTimeZone::OffsetData toOffsetData(const Data &data);
150 static bool isValidId(QByteArrayView ianaId);
151 static QString isoOffsetFormat(int offsetFromUtc,
152 QTimeZone::NameType mode = QTimeZone::OffsetName);
153
154 static QByteArrayView aliasToIana(QByteArrayView alias);
155 static QByteArrayView ianaIdToWindowsId(QByteArrayView ianaId);
156 static QByteArrayView windowsIdToDefaultIanaId(QByteArrayView windowsId);
157 static QByteArrayView windowsIdToDefaultIanaId(QByteArrayView windowsId,
158 QLocale::Territory territory);
159 static QList<QByteArray> windowsIdToIanaIds(QByteArrayView windowsId);
160 static QList<QByteArray> windowsIdToIanaIds(QByteArrayView windowsId,
161 QLocale::Territory territory);
162 struct NamePrefixMatch
163 {
164 QByteArray ianaId;
165 qsizetype nameLength = 0;
166 QTimeZone::TimeType timeType = QTimeZone::GenericTime;
167 operator bool() const { return nameLength > 0; }
168 };
169 static NamePrefixMatch findLongNamePrefix(QStringView text, const QLocale &locale,
170 std::optional<qint64> atEpochMillis = std::nullopt);
171 static NamePrefixMatch findNarrowOffsetPrefix(QStringView text, const QLocale &locale);
172 // Match the unlocalized long form of QUtcTimeZonePrivate:
173 static NamePrefixMatch findLongUtcPrefix(QStringView text);
174
175 // returns "UTC" QString and QByteArray
176 [[nodiscard]] static inline QString utcQString()
177 {
178 return QStringLiteral("UTC");
179 }
180
181 [[nodiscard]] static inline QByteArray utcQByteArray()
182 {
183 return QByteArrayLiteral("UTC");
184 }
185
186 [[nodiscard]] static QTimeZone utcQTimeZone();
187
188#ifdef QT_BUILD_INTERNAL // For the benefit of a test
189 [[nodiscard]] static inline const QTimeZonePrivate *extractPrivate(const QTimeZone &zone)
190 {
191 return zone.d.operator->();
192 }
193#endif
194
195protected:
196 // Zones CLDR data says match a condition.
197 // Use to filter what the backend has available.
198 QList<QByteArrayView> matchingTimeZoneIds(QLocale::Territory territory) const;
199 QList<QByteArrayView> matchingTimeZoneIds(int utcOffset) const;
200 // Use to extend a list with what its entries alias, then sort and uniquify:
201 static QList<QByteArray> uniqueSortedAliasPadded(QList<QByteArray> &&zoneIds);
202 static QList<QByteArray> padSortedWithAliases(QList<QByteArray> &&zoneIds);
203
204#if QT_CONFIG(timezone_locale)
205 // Defined in qtimezonelocale.cpp
206 QString localeName(qint64 atMSecsSinceEpoch, int offsetFromUtc,
207 QTimeZone::TimeType timeType,
208 QTimeZone::NameType nameType,
209 const QLocale &locale) const;
210#endif // L10n helpers.
211
212 QByteArray m_id;
213};
215
216class Q_AUTOTEST_EXPORT QUtcTimeZonePrivate final : public QTimeZonePrivate
217{
218 QUtcTimeZonePrivate &operator=(const QUtcTimeZonePrivate &) const = delete;
219 QUtcTimeZonePrivate(const QUtcTimeZonePrivate &other);
220public:
221 // Create default UTC time zone
222 QUtcTimeZonePrivate();
223 // Create named time zone
224 QUtcTimeZonePrivate(const QByteArray &utcId);
225 // Create offset from UTC
226 QUtcTimeZonePrivate(qint32 offsetSeconds);
227 // Create custom offset from UTC
228 QUtcTimeZonePrivate(const QByteArray &zoneId, int offsetSeconds, const QString &name,
229 const QString &abbreviation, QLocale::Territory territory,
230 const QString &comment);
231 virtual ~QUtcTimeZonePrivate();
232
233 // Fall-back for UTC[+-]\d+(:\d+){,2} IDs.
234 static qint64 offsetFromUtcString(QByteArrayView id);
235
236 QUtcTimeZonePrivate *clone() const override;
237
238 Data data(qint64 forMSecsSinceEpoch) const override;
239 Data data(QTimeZone::TimeType timeType) const override;
240 bool isDataLocale(const QLocale &locale) const override;
241
242 QLocale::Territory territory() const override;
243 QString comment() const override;
244
245 QString displayName(qint64 atMSecsSinceEpoch,
246 QTimeZone::NameType nameType,
247 const QLocale &locale) const override;
248 QString displayName(QTimeZone::TimeType timeType,
249 QTimeZone::NameType nameType,
250 const QLocale &locale) const override;
251 QString abbreviation(qint64 atMSecsSinceEpoch) const override;
252
253 int standardTimeOffset(qint64 atMSecsSinceEpoch) const override;
254 int daylightTimeOffset(qint64 atMSecsSinceEpoch) const override;
255
256 QByteArray systemTimeZoneId() const override;
257
258 bool isTimeZoneIdAvailable(QByteArrayView ianaId) const override;
259 QList<QByteArray> availableTimeZoneIds() const override;
260 QList<QByteArray> availableTimeZoneIds(QLocale::Territory country) const override;
261 QList<QByteArray> availableTimeZoneIds(int utcOffset) const override;
262
263 void serialize(QDataStream &ds) const override;
264
265private:
266 void init(const QByteArray &zoneId, int offsetSeconds, const QString &name,
267 const QString &abbreviation, QLocale::Territory territory,
268 const QString &comment);
269
270 QString m_name;
271 QString m_abbreviation;
272 QString m_comment;
273 QLocale::Territory m_territory;
274 int m_offsetFromUtc;
275};
276
277// Platform backend cascade: match newBackendTimeZone() in qtimezone.cpp
278#if QT_CONFIG(timezone_tzdb)
279class QChronoTimeZonePrivate final : public QTimeZonePrivate
280{
281 QChronoTimeZonePrivate &operator=(const QChronoTimeZonePrivate &) const = delete;
282 QChronoTimeZonePrivate(const QChronoTimeZonePrivate &) = default;
283public:
284 QChronoTimeZonePrivate();
285 QChronoTimeZonePrivate(QByteArrayView id);
286 ~QChronoTimeZonePrivate() override;
287 QChronoTimeZonePrivate *clone() const override;
288
289 QByteArray systemTimeZoneId() const override;
290
291 QString abbreviation(qint64 atMSecsSinceEpoch) const override;
292 int offsetFromUtc(qint64 atMSecsSinceEpoch) const override;
293 int standardTimeOffset(qint64 atMSecsSinceEpoch) const override;
294 int daylightTimeOffset(qint64 atMSecsSinceEpoch) const override;
295
296 bool isTimeZoneIdAvailable(QByteArrayView ianaId) const override;
297 QList<QByteArray> availableTimeZoneIds() const override;
298 QList<QByteArray> availableTimeZoneIds(int utcOffset) const override;
299
300 bool hasDaylightTime() const override;
301 bool isDaylightTime(qint64 atMSecsSinceEpoch) const override;
302
303 Data data(qint64 forMSecsSinceEpoch) const override;
304
305 bool hasTransitions() const override;
306 Data nextTransition(qint64 afterMSecsSinceEpoch) const override;
307 Data previousTransition(qint64 beforeMSecsSinceEpoch) const override;
308
309private:
310 const std::chrono::time_zone *const m_timeZone;
311};
312#elif defined(Q_OS_DARWIN)
313class Q_AUTOTEST_EXPORT QMacTimeZonePrivate final : public QTimeZonePrivate
314{
315 QMacTimeZonePrivate &operator=(const QMacTimeZonePrivate &) const = delete;
316 QMacTimeZonePrivate(const QMacTimeZonePrivate &other);
317public:
318 // Create default time zone
319 QMacTimeZonePrivate();
320 // Create named time zone
321 QMacTimeZonePrivate(const QByteArray &ianaId);
322 ~QMacTimeZonePrivate();
323
324 QMacTimeZonePrivate *clone() const override;
325
326 QString comment() const override;
327
328 using QTimeZonePrivate::displayName;
329 QString displayName(QTimeZone::TimeType timeType, QTimeZone::NameType nameType,
330 const QLocale &locale) const override;
331 QString abbreviation(qint64 atMSecsSinceEpoch) const override;
332
333 int offsetFromUtc(qint64 atMSecsSinceEpoch) const override;
334 int standardTimeOffset(qint64 atMSecsSinceEpoch) const override;
335 int daylightTimeOffset(qint64 atMSecsSinceEpoch) const override;
336
337 bool hasDaylightTime() const override;
338 bool isDaylightTime(qint64 atMSecsSinceEpoch) const override;
339
340 using QTimeZonePrivate::data;
341 Data data(qint64 forMSecsSinceEpoch) const override;
342
343 bool hasTransitions() const override;
344 Data nextTransition(qint64 afterMSecsSinceEpoch) const override;
345 Data previousTransition(qint64 beforeMSecsSinceEpoch) const override;
346
347 QByteArray systemTimeZoneId() const override;
348 bool isTimeZoneIdAvailable(QByteArrayView ianaId) const override;
349 QList<QByteArray> availableTimeZoneIds() const override;
350
351 NSTimeZone *nsTimeZone() const;
352
353private:
354 void init(const QByteArray &zoneId);
355
356 NSTimeZone *m_nstz;
357};
358#elif defined(Q_OS_ANDROID)
359class QAndroidTimeZonePrivate final : public QTimeZonePrivate
360{
361 QAndroidTimeZonePrivate &operator=(const QAndroidTimeZonePrivate &) const = delete;
362 QAndroidTimeZonePrivate(const QAndroidTimeZonePrivate &) = default;
363public:
364 // Create default time zone
365 QAndroidTimeZonePrivate();
366 // Create named time zone
367 QAndroidTimeZonePrivate(QByteArrayView ianaId);
368 ~QAndroidTimeZonePrivate();
369
370 QAndroidTimeZonePrivate *clone() const override;
371
372 using QTimeZonePrivate::displayName;
373 QString displayName(QTimeZone::TimeType timeType, QTimeZone::NameType nameType,
374 const QLocale &locale) const override;
375 QString abbreviation(qint64 atMSecsSinceEpoch) const override;
376
377 int offsetFromUtc(qint64 atMSecsSinceEpoch) const override;
378 int standardTimeOffset(qint64 atMSecsSinceEpoch) const override;
379 int daylightTimeOffset(qint64 atMSecsSinceEpoch) const override;
380
381 bool hasDaylightTime() const override;
382 bool isDaylightTime(qint64 atMSecsSinceEpoch) const override;
383
384 using QTimeZonePrivate::data;
385 Data data(qint64 forMSecsSinceEpoch) const override;
386
387 QByteArray systemTimeZoneId() const override;
388 bool isTimeZoneIdAvailable(QByteArrayView ianaId) const override;
389 QList<QByteArray> availableTimeZoneIds() const override;
390
391private:
392 void init(QByteArrayView zoneId);
393
394 QJniObject androidTimeZone;
395};
396#elif defined(Q_OS_UNIX) && !defined(Q_OS_VXWORKS) && !defined(Q_OS_WASM)
397struct QTzTransitionTime
398{
399 qint64 atMSecsSinceEpoch;
400 quint8 ruleIndex;
401};
402Q_DECLARE_TYPEINFO(QTzTransitionTime, Q_PRIMITIVE_TYPE);
403struct QTzTransitionRule
404{
405 int stdOffset = 0;
406 int dstOffset = 0;
407 quint8 abbreviationIndex = 0;
408};
409Q_DECLARE_TYPEINFO(QTzTransitionRule, Q_PRIMITIVE_TYPE);
410constexpr inline bool operator==(const QTzTransitionRule &lhs, const QTzTransitionRule &rhs) noexcept
411{ return lhs.stdOffset == rhs.stdOffset && lhs.dstOffset == rhs.dstOffset && lhs.abbreviationIndex == rhs.abbreviationIndex; }
412constexpr inline bool operator!=(const QTzTransitionRule &lhs, const QTzTransitionRule &rhs) noexcept
413{ return !operator==(lhs, rhs); }
414
415// These are stored separately from QTzTimeZonePrivate so that they can be
416// cached, avoiding the need to re-parse them from disk constantly.
417struct QTzTimeZoneCacheEntry
418{
419 QList<QTzTransitionTime> m_tranTimes;
420 QList<QTzTransitionRule> m_tranRules;
421 QList<QByteArray> m_abbreviations;
422 QByteArray m_posixRule;
423 QTzTransitionRule m_preZoneRule;
424 bool m_hasDst = false;
425};
426
427class Q_AUTOTEST_EXPORT QTzTimeZonePrivate final : public QTimeZonePrivate
428{
429 QTzTimeZonePrivate &operator=(const QTzTimeZonePrivate &) const = delete;
430 QTzTimeZonePrivate(const QTzTimeZonePrivate &) = default;
431public:
432 // Create default time zone
433 QTzTimeZonePrivate();
434 // Create named time zone
435 QTzTimeZonePrivate(const QByteArray &ianaId);
436 ~QTzTimeZonePrivate();
437
438 QTzTimeZonePrivate *clone() const override;
439
440 QLocale::Territory territory() const override;
441 QString comment() const override;
442
443 using QTimeZonePrivate::displayName;
444 QString displayName(QTimeZone::TimeType timeType,
445 QTimeZone::NameType nameType,
446 const QLocale &locale) const override;
447 QString abbreviation(qint64 atMSecsSinceEpoch) const override;
448
449 int offsetFromUtc(qint64 atMSecsSinceEpoch) const override;
450 int standardTimeOffset(qint64 atMSecsSinceEpoch) const override;
451 int daylightTimeOffset(qint64 atMSecsSinceEpoch) const override;
452
453 bool hasDaylightTime() const override;
454 bool isDaylightTime(qint64 atMSecsSinceEpoch) const override;
455
456 Data data(qint64 forMSecsSinceEpoch) const override;
457 Data data(QTimeZone::TimeType timeType) const override;
458 bool isDataLocale(const QLocale &locale) const override;
459
460 bool hasTransitions() const override;
461 Data nextTransition(qint64 afterMSecsSinceEpoch) const override;
462 Data previousTransition(qint64 beforeMSecsSinceEpoch) const override;
463
464 QByteArray systemTimeZoneId() const override;
465
466 bool isTimeZoneIdAvailable(QByteArrayView ianaId) const override;
467 QList<QByteArray> availableTimeZoneIds() const override;
468 QList<QByteArray> availableTimeZoneIds(QLocale::Territory territory) const override;
469
470private:
471 static QByteArray staticSystemTimeZoneId();
472 QList<QTimeZonePrivate::Data> getPosixTransitions(qint64 msNear) const;
473
474 Data dataForTzTransition(QTzTransitionTime tran) const;
475 Data dataFromRule(QTzTransitionRule rule, qint64 msecsSinceEpoch) const;
476 QTzTimeZoneCacheEntry cached_data;
477 const QList<QTzTransitionTime> &tranCache() const { return cached_data.m_tranTimes; }
478};
479#elif QT_CONFIG(icu)
480class Q_AUTOTEST_EXPORT QIcuTimeZonePrivate final : public QTimeZonePrivate
481{
482 QIcuTimeZonePrivate &operator=(const QIcuTimeZonePrivate &) const = delete;
483 QIcuTimeZonePrivate(const QIcuTimeZonePrivate &other);
484public:
485 // Create default time zone
486 QIcuTimeZonePrivate();
487 // Create named time zone
488 QIcuTimeZonePrivate(const QByteArray &ianaId);
489 ~QIcuTimeZonePrivate();
490
491 QIcuTimeZonePrivate *clone() const override;
492
493 using QTimeZonePrivate::displayName;
494 QString displayName(QTimeZone::TimeType timeType, QTimeZone::NameType nameType,
495 const QLocale &locale) const override;
496
497 int offsetFromUtc(qint64 atMSecsSinceEpoch) const override;
498 int standardTimeOffset(qint64 atMSecsSinceEpoch) const override;
499 int daylightTimeOffset(qint64 atMSecsSinceEpoch) const override;
500
501 bool hasDaylightTime() const override;
502 bool isDaylightTime(qint64 atMSecsSinceEpoch) const override;
503
504 using QTimeZonePrivate::data;
505 Data data(qint64 forMSecsSinceEpoch) const override;
506
507 bool hasTransitions() const override;
508 Data nextTransition(qint64 afterMSecsSinceEpoch) const override;
509 Data previousTransition(qint64 beforeMSecsSinceEpoch) const override;
510
511 QByteArray systemTimeZoneId() const override;
512
513 bool isTimeZoneIdAvailable(QByteArrayView ianaId) const override;
514 QList<QByteArray> availableTimeZoneIds() const override;
515 QList<QByteArray> availableTimeZoneIds(QLocale::Territory territory) const override;
516 QList<QByteArray> availableTimeZoneIds(int offsetFromUtc) const override;
517
518private:
519 void init(const QByteArray &ianaId);
520
521 UCalendar *m_ucal;
522};
523#elif defined(Q_OS_WIN)
524class Q_AUTOTEST_EXPORT QWinTimeZonePrivate final : public QTimeZonePrivate
525{
526 QWinTimeZonePrivate &operator=(const QWinTimeZonePrivate &) const = delete;
527 QWinTimeZonePrivate(const QWinTimeZonePrivate &) = default;
528public:
529 struct QWinTransitionRule {
530 int startYear;
531 int standardTimeBias;
532 int daylightTimeBias;
533 SYSTEMTIME standardTimeRule;
534 SYSTEMTIME daylightTimeRule;
535 };
536
537 // Create default time zone
538 QWinTimeZonePrivate();
539 // Create named time zone
540 QWinTimeZonePrivate(const QByteArray &ianaId);
541 ~QWinTimeZonePrivate();
542
543 QWinTimeZonePrivate *clone() const override;
544
545 QString comment() const override;
546
547 using QTimeZonePrivate::displayName;
548 QString displayName(QTimeZone::TimeType timeType, QTimeZone::NameType nameType,
549 const QLocale &locale) const override;
550 QString abbreviation(qint64 atMSecsSinceEpoch) const override;
551
552 int offsetFromUtc(qint64 atMSecsSinceEpoch) const override;
553 int standardTimeOffset(qint64 atMSecsSinceEpoch) const override;
554 int daylightTimeOffset(qint64 atMSecsSinceEpoch) const override;
555
556 bool hasDaylightTime() const override;
557 bool isDaylightTime(qint64 atMSecsSinceEpoch) const override;
558
559 using QTimeZonePrivate::data;
560 Data data(qint64 forMSecsSinceEpoch) const override;
561
562 bool hasTransitions() const override;
563 Data nextTransition(qint64 afterMSecsSinceEpoch) const override;
564 Data previousTransition(qint64 beforeMSecsSinceEpoch) const override;
565
566 QByteArray systemTimeZoneId() const override;
567
568 QList<QByteArray> availableTimeZoneIds() const override;
569
570 // For use within implementation's TransitionTimePair:
571 QTimeZonePrivate::Data ruleToData(const QWinTransitionRule &rule, qint64 atMSecsSinceEpoch,
572 QTimeZone::TimeType type, bool fakeDst = false) const;
573private:
574 void init(const QByteArray &ianaId);
575
576 QByteArray m_windowsId;
577 QString m_displayName;
578 QString m_standardName;
579 QString m_daylightName;
580 QList<QWinTransitionRule> m_tranRules;
581};
582#endif // C++20, Darwin, Android, Unix, ICU, Win.
583
584QT_END_NAMESPACE
585
586#endif // QTIMEZONEPRIVATE_P_H
Definition qlist.h:81
static constexpr WindowsData windowsDataTable[]
static constexpr ZoneData zoneDataTable[]
static constexpr AliasData aliasMappingTable[]
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 QByteArrayView aliasMatching(QByteArrayView name, Pred test)
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 quint16 toWindowsIdKey(QByteArrayView winId)
static QList< QByteArray > selectAvailable(QList< QByteArrayView > &&desired, const QList< QByteArray > &all)
static QByteArrayView 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)