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#include "private/qttemporalpattern_p.h" // For its flags type
26
27#if QT_CONFIG(timezone_tzdb)
28#include <chrono>
29#endif
30#include <optional>
31
32#if QT_CONFIG(icu)
33#include <unicode/ucal.h>
34#endif
35
36#ifdef Q_OS_DARWIN
37Q_FORWARD_DECLARE_OBJC_CLASS(NSTimeZone);
38#endif // Q_OS_DARWIN
39
40#ifdef Q_OS_WIN
41#include <qt_windows.h>
42#endif // Q_OS_WIN
43
44#ifdef Q_OS_ANDROID
45#include <QJniObject>
46#endif
47
50
51class Q_AUTOTEST_EXPORT QTimeZonePrivate : public QSharedData
52{
53 // Nothing should be copy-assigning instances of either this or its derived
54 // classes (only clone() should copy, using the copy-constructor):
55 QTimeZonePrivate &operator=(const QTimeZonePrivate &) const = delete;
56protected:
57 QTimeZonePrivate(const QTimeZonePrivate &other) = default;
58public:
59 // Version of QTimeZone::OffsetData struct using msecs for efficiency
60 struct Data {
61 QString abbreviation;
62 qint64 atMSecsSinceEpoch;
63 int offsetFromUtc;
64 int standardTimeOffset;
65 int daylightTimeOffset;
66 Data()
67 : atMSecsSinceEpoch(QTimeZonePrivate::invalidMSecs()),
68 offsetFromUtc(QTimeZonePrivate::invalidSeconds()),
69 standardTimeOffset(QTimeZonePrivate::invalidSeconds()),
70 daylightTimeOffset(QTimeZonePrivate::invalidSeconds())
71 {}
72 Data(const QString &name, qint64 when, int offset, int standard)
73 : abbreviation(name),
74 atMSecsSinceEpoch(when),
75 offsetFromUtc(offset),
76 standardTimeOffset(standard),
77 daylightTimeOffset(offset - standard)
78 {}
79 };
80 typedef QList<Data> DataList;
81
82 // Create null time zone
83 QTimeZonePrivate();
84 virtual ~QTimeZonePrivate();
85
86 virtual QTimeZonePrivate *clone() const = 0;
87
88 bool operator==(const QTimeZonePrivate &other) const;
89 bool operator!=(const QTimeZonePrivate &other) const;
90
91 bool isValid() const;
92
93 QByteArray id() const;
94 virtual QLocale::Territory territory() const;
95 virtual QString comment() const;
96
97 virtual QString displayName(qint64 atMSecsSinceEpoch,
98 QTimeZone::NameType nameType,
99 const QLocale &locale) const;
100 virtual QString displayName(QTimeZone::TimeType timeType,
101 QTimeZone::NameType nameType,
102 const QLocale &locale) const;
103 virtual QString abbreviation(qint64 atMSecsSinceEpoch) const;
104
105 virtual int offsetFromUtc(qint64 atMSecsSinceEpoch) const;
106 virtual int standardTimeOffset(qint64 atMSecsSinceEpoch) const;
107 virtual int daylightTimeOffset(qint64 atMSecsSinceEpoch) const;
108
109 virtual bool hasDaylightTime() const;
110 virtual bool isDaylightTime(qint64 atMSecsSinceEpoch) const;
111
112 virtual Data data(qint64 forMSecsSinceEpoch) const;
113 virtual Data data(QTimeZone::TimeType timeType) const;
114 virtual bool isDataLocale(const QLocale &locale) const;
115 static bool isAnglicLocale(const QLocale &locale)
116 {
117 // Sufficiently like the C locale for displayName()-related purposes:
118 const QLocale::Language lang = locale.language();
119 return lang == QLocale::C
120 || (lang == QLocale::English && locale.script() == QLocale::LatinScript);
121 }
122 QDateTimePrivate::ZoneState stateAtZoneTime(qint64 forLocalMSecs,
123 QDateTimePrivate::TransitionOptions resolve) const;
124
125 virtual bool hasTransitions() const;
126 virtual Data nextTransition(qint64 afterMSecsSinceEpoch) const;
127 virtual Data previousTransition(qint64 beforeMSecsSinceEpoch) const;
128 DataList transitions(qint64 fromMSecsSinceEpoch, qint64 toMSecsSinceEpoch) const;
129
130 virtual QByteArray systemTimeZoneId() const;
131
132 QByteArrayView availableAlias(QByteArrayView ianaId) const; // Empty if none.
133 virtual bool isTimeZoneIdAvailable(QByteArrayView ianaId) const;
134 virtual QList<QByteArray> availableTimeZoneIds() const = 0;
135 virtual QList<QByteArray> availableTimeZoneIds(QLocale::Territory territory) const;
136 virtual QList<QByteArray> availableTimeZoneIds(int utcOffset) const;
137
138 virtual void serialize(QDataStream &ds) const;
139
140 // Static Utility Methods
141 [[nodiscard]] static constexpr qint64 maxMSecs()
142 { return (std::numeric_limits<qint64>::max)(); }
143 [[nodiscard]] static constexpr qint64 minMSecs()
144 { return (std::numeric_limits<qint64>::min)() + 1; }
145 [[nodiscard]] static constexpr qint64 invalidMSecs()
146 { return (std::numeric_limits<qint64>::min)(); }
147 [[nodiscard]] static constexpr int invalidSeconds()
148 { return (std::numeric_limits<int>::min)(); }
149 static QTimeZone::OffsetData invalidOffsetData();
150 static QTimeZone::OffsetData toOffsetData(const Data &data);
151 static bool isValidId(QByteArrayView ianaId);
152 static QString isoOffsetFormat(int offsetFromUtc,
153 QTimeZone::NameType mode = QTimeZone::OffsetName);
154
155 static QByteArrayView aliasToIana(QByteArrayView alias);
156 static QByteArrayView ianaIdToWindowsId(QByteArrayView ianaId);
157 static QByteArrayView windowsIdToDefaultIanaId(QByteArrayView windowsId);
158 static QByteArrayView windowsIdToDefaultIanaId(QByteArrayView windowsId,
159 QLocale::Territory territory);
160 static QList<QByteArray> windowsIdToIanaIds(QByteArrayView windowsId);
161 static QList<QByteArray> windowsIdToIanaIds(QByteArrayView windowsId,
162 QLocale::Territory territory);
163 struct NamePrefixMatch
164 {
165 QByteArray ianaId;
166 qsizetype nameLength = 0;
167 QTimeZone::TimeType timeType = QTimeZone::GenericTime;
168 std::optional<int> offset = {}; // Set when fixed-offset for UTC / OffsetFromUTC
169 operator bool() const { return nameLength > 0; }
170 };
171 static NamePrefixMatch findLongNamePrefix(QStringView text, const QLocale &locale,
172 std::optional<qint64> atEpochMillis = std::nullopt);
173 static NamePrefixMatch findNarrowOffsetPrefix(QStringView text, const QLocale &locale);
174 // Implement in backends where possible, with #if-ery on base-class to
175 // suppress its expensive brute force when better is available.
176 static NamePrefixMatch findOffsetPrefix(QStringView text, const QLocale &locale,
177 QtTemporalPattern::TemporalFieldFlags flags = {});
178 // Match the unlocalized long form of QUtcTimeZonePrivate:
179 static NamePrefixMatch findLongUtcPrefix(QStringView text);
180 static QList<QByteArray> getCanonicalZonesThenAliases();
181
182 // returns "UTC" QString and QByteArray
183 [[nodiscard]] static inline QString utcQString()
184 {
185 return QStringLiteral("UTC");
186 }
187
188 [[nodiscard]] static inline QByteArray utcQByteArray()
189 {
190 return QByteArrayLiteral("UTC");
191 }
192
193 [[nodiscard]] static QTimeZone utcQTimeZone();
194
195#ifdef QT_BUILD_INTERNAL // For the benefit of a test
196 [[nodiscard]] static inline const QTimeZonePrivate *extractPrivate(const QTimeZone &zone)
197 {
198 return zone.d.operator->();
199 }
200#endif
201
202protected:
203 // Zones CLDR data says match a condition.
204 // Use to filter what the backend has available.
205 QList<QByteArrayView> matchingTimeZoneIds(QLocale::Territory territory) const;
206 QList<QByteArrayView> matchingTimeZoneIds(int utcOffset) const;
207 // Use to extend a list with what its entries alias, then sort and uniquify:
208 static QList<QByteArray> uniqueSortedAliasPadded(QList<QByteArray> &&zoneIds);
209 static QList<QByteArray> padSortedWithAliases(QList<QByteArray> &&zoneIds);
210
211#if QT_CONFIG(timezone_locale)
212 // Defined in qtimezonelocale.cpp
213 QString localeName(qint64 atMSecsSinceEpoch, int offsetFromUtc,
214 QTimeZone::TimeType timeType,
215 QTimeZone::NameType nameType,
216 const QLocale &locale) const;
217#endif // L10n helpers.
218
219 QByteArray m_id;
220};
222
223class Q_AUTOTEST_EXPORT QUtcTimeZonePrivate final : public QTimeZonePrivate
224{
225 QUtcTimeZonePrivate &operator=(const QUtcTimeZonePrivate &) const = delete;
226 QUtcTimeZonePrivate(const QUtcTimeZonePrivate &other);
227public:
228 // Create default UTC time zone
229 QUtcTimeZonePrivate();
230 // Create named time zone
231 QUtcTimeZonePrivate(const QByteArray &utcId);
232 // Create offset from UTC
233 QUtcTimeZonePrivate(qint32 offsetSeconds);
234 // Create custom offset from UTC
235 QUtcTimeZonePrivate(const QByteArray &zoneId, int offsetSeconds, const QString &name,
236 const QString &abbreviation, QLocale::Territory territory,
237 const QString &comment);
238 virtual ~QUtcTimeZonePrivate();
239
240 // Fall-back for UTC[+-]\d+(:\d+){,2} IDs.
241 static qint64 offsetFromUtcString(QByteArrayView id);
242
243 QUtcTimeZonePrivate *clone() const override;
244
245 Data data(qint64 forMSecsSinceEpoch) const override;
246 Data data(QTimeZone::TimeType timeType) const override;
247 bool isDataLocale(const QLocale &locale) const override;
248
249 QLocale::Territory territory() const override;
250 QString comment() const override;
251
252 QString displayName(qint64 atMSecsSinceEpoch,
253 QTimeZone::NameType nameType,
254 const QLocale &locale) const override;
255 QString displayName(QTimeZone::TimeType timeType,
256 QTimeZone::NameType nameType,
257 const QLocale &locale) const override;
258 QString abbreviation(qint64 atMSecsSinceEpoch) const override;
259
260 int standardTimeOffset(qint64 atMSecsSinceEpoch) const override;
261 int daylightTimeOffset(qint64 atMSecsSinceEpoch) const override;
262
263 QByteArray systemTimeZoneId() const override;
264
265 bool isTimeZoneIdAvailable(QByteArrayView ianaId) const override;
266 QList<QByteArray> availableTimeZoneIds() const override;
267 QList<QByteArray> availableTimeZoneIds(QLocale::Territory country) const override;
268 QList<QByteArray> availableTimeZoneIds(int utcOffset) const override;
269
270 void serialize(QDataStream &ds) const override;
271
272private:
273 void init(const QByteArray &zoneId, int offsetSeconds, const QString &name,
274 const QString &abbreviation, QLocale::Territory territory,
275 const QString &comment);
276
277 QString m_name;
278 QString m_abbreviation;
279 QString m_comment;
280 QLocale::Territory m_territory;
281 int m_offsetFromUtc;
282};
283
284// Platform backend cascade: match newBackendTimeZone() in qtimezone.cpp
285#if QT_CONFIG(timezone_tzdb)
286class QChronoTimeZonePrivate final : public QTimeZonePrivate
287{
288 QChronoTimeZonePrivate &operator=(const QChronoTimeZonePrivate &) const = delete;
289 QChronoTimeZonePrivate(const QChronoTimeZonePrivate &) = default;
290public:
291 QChronoTimeZonePrivate();
292 QChronoTimeZonePrivate(QByteArrayView id);
293 ~QChronoTimeZonePrivate() override;
294 QChronoTimeZonePrivate *clone() const override;
295
296 QByteArray systemTimeZoneId() const override;
297
298 QString abbreviation(qint64 atMSecsSinceEpoch) const override;
299 int offsetFromUtc(qint64 atMSecsSinceEpoch) const override;
300 int standardTimeOffset(qint64 atMSecsSinceEpoch) const override;
301 int daylightTimeOffset(qint64 atMSecsSinceEpoch) const override;
302
303 bool isTimeZoneIdAvailable(QByteArrayView ianaId) const override;
304 QList<QByteArray> availableTimeZoneIds() const override;
305 QList<QByteArray> availableTimeZoneIds(int utcOffset) const override;
306
307 bool hasDaylightTime() const override;
308 bool isDaylightTime(qint64 atMSecsSinceEpoch) const override;
309
310 Data data(qint64 forMSecsSinceEpoch) const override;
311
312 bool hasTransitions() const override;
313 Data nextTransition(qint64 afterMSecsSinceEpoch) const override;
314 Data previousTransition(qint64 beforeMSecsSinceEpoch) const override;
315
316private:
317 const std::chrono::time_zone *const m_timeZone;
318};
319#elif defined(Q_OS_DARWIN)
320class Q_AUTOTEST_EXPORT QMacTimeZonePrivate final : public QTimeZonePrivate
321{
322 QMacTimeZonePrivate &operator=(const QMacTimeZonePrivate &) const = delete;
323 QMacTimeZonePrivate(const QMacTimeZonePrivate &other);
324public:
325 // Create default time zone
326 QMacTimeZonePrivate();
327 // Create named time zone
328 QMacTimeZonePrivate(const QByteArray &ianaId);
329 ~QMacTimeZonePrivate();
330
331 QMacTimeZonePrivate *clone() const override;
332
333 QString comment() const override;
334
335 using QTimeZonePrivate::displayName;
336 QString displayName(QTimeZone::TimeType timeType, QTimeZone::NameType nameType,
337 const QLocale &locale) const override;
338 QString abbreviation(qint64 atMSecsSinceEpoch) const override;
339
340 int offsetFromUtc(qint64 atMSecsSinceEpoch) const override;
341 int standardTimeOffset(qint64 atMSecsSinceEpoch) const override;
342 int daylightTimeOffset(qint64 atMSecsSinceEpoch) const override;
343
344 bool hasDaylightTime() const override;
345 bool isDaylightTime(qint64 atMSecsSinceEpoch) const override;
346
347 using QTimeZonePrivate::data;
348 Data data(qint64 forMSecsSinceEpoch) const override;
349
350 bool hasTransitions() const override;
351 Data nextTransition(qint64 afterMSecsSinceEpoch) const override;
352 Data previousTransition(qint64 beforeMSecsSinceEpoch) const override;
353
354 QByteArray systemTimeZoneId() const override;
355 bool isTimeZoneIdAvailable(QByteArrayView ianaId) const override;
356 QList<QByteArray> availableTimeZoneIds() const override;
357
358 NSTimeZone *nsTimeZone() const;
359
360private:
361 void init(const QByteArray &zoneId);
362
363 NSTimeZone *m_nstz;
364};
365#elif defined(Q_OS_ANDROID)
366class QAndroidTimeZonePrivate final : public QTimeZonePrivate
367{
368 QAndroidTimeZonePrivate &operator=(const QAndroidTimeZonePrivate &) const = delete;
369 QAndroidTimeZonePrivate(const QAndroidTimeZonePrivate &) = default;
370public:
371 // Create default time zone
372 QAndroidTimeZonePrivate();
373 // Create named time zone
374 QAndroidTimeZonePrivate(QByteArrayView ianaId);
375 ~QAndroidTimeZonePrivate();
376
377 QAndroidTimeZonePrivate *clone() const override;
378
379 using QTimeZonePrivate::displayName;
380 QString displayName(QTimeZone::TimeType timeType, QTimeZone::NameType nameType,
381 const QLocale &locale) const override;
382 QString abbreviation(qint64 atMSecsSinceEpoch) const override;
383
384 int offsetFromUtc(qint64 atMSecsSinceEpoch) const override;
385 int standardTimeOffset(qint64 atMSecsSinceEpoch) const override;
386 int daylightTimeOffset(qint64 atMSecsSinceEpoch) const override;
387
388 bool hasDaylightTime() const override;
389 bool isDaylightTime(qint64 atMSecsSinceEpoch) const override;
390
391 using QTimeZonePrivate::data;
392 Data data(qint64 forMSecsSinceEpoch) const override;
393
394 QByteArray systemTimeZoneId() const override;
395 bool isTimeZoneIdAvailable(QByteArrayView ianaId) const override;
396 QList<QByteArray> availableTimeZoneIds() const override;
397
398private:
399 void init(QByteArrayView zoneId);
400
401 QJniObject androidTimeZone;
402};
403#elif defined(Q_OS_UNIX) && !defined(Q_OS_VXWORKS) && !defined(Q_OS_WASM) && !defined(Q_OS_HARMONY)
404struct QTzTransitionTime
405{
406 qint64 atMSecsSinceEpoch;
407 quint8 ruleIndex;
408};
409Q_DECLARE_TYPEINFO(QTzTransitionTime, Q_PRIMITIVE_TYPE);
410struct QTzTransitionRule
411{
412 int stdOffset = 0;
413 int dstOffset = 0;
414 quint8 abbreviationIndex = 0;
415};
416Q_DECLARE_TYPEINFO(QTzTransitionRule, Q_PRIMITIVE_TYPE);
417constexpr inline bool operator==(const QTzTransitionRule &lhs, const QTzTransitionRule &rhs) noexcept
418{ return lhs.stdOffset == rhs.stdOffset && lhs.dstOffset == rhs.dstOffset && lhs.abbreviationIndex == rhs.abbreviationIndex; }
419constexpr inline bool operator!=(const QTzTransitionRule &lhs, const QTzTransitionRule &rhs) noexcept
420{ return !operator==(lhs, rhs); }
421
422// These are stored separately from QTzTimeZonePrivate so that they can be
423// cached, avoiding the need to re-parse them from disk constantly.
424struct QTzTimeZoneCacheEntry
425{
426 QList<QTzTransitionTime> m_tranTimes;
427 QList<QTzTransitionRule> m_tranRules;
428 QList<QByteArray> m_abbreviations;
429 QByteArray m_posixRule;
430 QTzTransitionRule m_preZoneRule;
431 bool m_hasDst = false;
432};
433
434class Q_AUTOTEST_EXPORT QTzTimeZonePrivate final : public QTimeZonePrivate
435{
436 QTzTimeZonePrivate &operator=(const QTzTimeZonePrivate &) const = delete;
437 QTzTimeZonePrivate(const QTzTimeZonePrivate &) = default;
438public:
439 // Create default time zone
440 QTzTimeZonePrivate();
441 // Create named time zone
442 QTzTimeZonePrivate(const QByteArray &ianaId);
443 ~QTzTimeZonePrivate();
444
445 QTzTimeZonePrivate *clone() const override;
446
447 QLocale::Territory territory() const override;
448 QString comment() const override;
449
450 using QTimeZonePrivate::displayName;
451 QString displayName(QTimeZone::TimeType timeType,
452 QTimeZone::NameType nameType,
453 const QLocale &locale) const override;
454 QString abbreviation(qint64 atMSecsSinceEpoch) const override;
455
456 int offsetFromUtc(qint64 atMSecsSinceEpoch) const override;
457 int standardTimeOffset(qint64 atMSecsSinceEpoch) const override;
458 int daylightTimeOffset(qint64 atMSecsSinceEpoch) const override;
459
460 bool hasDaylightTime() const override;
461 bool isDaylightTime(qint64 atMSecsSinceEpoch) const override;
462
463 Data data(qint64 forMSecsSinceEpoch) const override;
464 Data data(QTimeZone::TimeType timeType) const override;
465 bool isDataLocale(const QLocale &locale) const override;
466
467 bool hasTransitions() const override;
468 Data nextTransition(qint64 afterMSecsSinceEpoch) const override;
469 Data previousTransition(qint64 beforeMSecsSinceEpoch) const override;
470
471 QByteArray systemTimeZoneId() const override;
472
473 bool isTimeZoneIdAvailable(QByteArrayView ianaId) const override;
474 QList<QByteArray> availableTimeZoneIds() const override;
475 QList<QByteArray> availableTimeZoneIds(QLocale::Territory territory) const override;
476
477private:
478 static QByteArray staticSystemTimeZoneId();
479 QList<QTimeZonePrivate::Data> getPosixTransitions(qint64 msNear) const;
480
481 Data dataForTzTransition(QTzTransitionTime tran) const;
482 Data dataFromRule(QTzTransitionRule rule, qint64 msecsSinceEpoch) const;
483 QTzTimeZoneCacheEntry cached_data;
484 const QList<QTzTransitionTime> &tranCache() const { return cached_data.m_tranTimes; }
485};
486#elif QT_CONFIG(icu)
487class Q_AUTOTEST_EXPORT QIcuTimeZonePrivate final : public QTimeZonePrivate
488{
489 QIcuTimeZonePrivate &operator=(const QIcuTimeZonePrivate &) const = delete;
490 QIcuTimeZonePrivate(const QIcuTimeZonePrivate &other);
491public:
492 // Create default time zone
493 QIcuTimeZonePrivate();
494 // Create named time zone
495 QIcuTimeZonePrivate(const QByteArray &ianaId);
496 ~QIcuTimeZonePrivate();
497
498 QIcuTimeZonePrivate *clone() const override;
499
500 using QTimeZonePrivate::displayName;
501 QString displayName(QTimeZone::TimeType timeType, QTimeZone::NameType nameType,
502 const QLocale &locale) const override;
503
504 int offsetFromUtc(qint64 atMSecsSinceEpoch) const override;
505 int standardTimeOffset(qint64 atMSecsSinceEpoch) const override;
506 int daylightTimeOffset(qint64 atMSecsSinceEpoch) const override;
507
508 bool hasDaylightTime() const override;
509 bool isDaylightTime(qint64 atMSecsSinceEpoch) const override;
510
511 using QTimeZonePrivate::data;
512 Data data(qint64 forMSecsSinceEpoch) const override;
513
514 bool hasTransitions() const override;
515 Data nextTransition(qint64 afterMSecsSinceEpoch) const override;
516 Data previousTransition(qint64 beforeMSecsSinceEpoch) const override;
517
518 QByteArray systemTimeZoneId() const override;
519
520 bool isTimeZoneIdAvailable(QByteArrayView ianaId) const override;
521 QList<QByteArray> availableTimeZoneIds() const override;
522 QList<QByteArray> availableTimeZoneIds(QLocale::Territory territory) const override;
523 QList<QByteArray> availableTimeZoneIds(int offsetFromUtc) const override;
524
525private:
526 void init(const QByteArray &ianaId);
527
528 UCalendar *m_ucal;
529};
530#elif defined(Q_OS_WIN)
531class Q_AUTOTEST_EXPORT QWinTimeZonePrivate final : public QTimeZonePrivate
532{
533 QWinTimeZonePrivate &operator=(const QWinTimeZonePrivate &) const = delete;
534 QWinTimeZonePrivate(const QWinTimeZonePrivate &) = default;
535public:
536 struct QWinTransitionRule {
537 int startYear;
538 int standardTimeBias;
539 int daylightTimeBias;
540 SYSTEMTIME standardTimeRule;
541 SYSTEMTIME daylightTimeRule;
542 };
543
544 // Create default time zone
545 QWinTimeZonePrivate();
546 // Create named time zone
547 QWinTimeZonePrivate(const QByteArray &ianaId);
548 ~QWinTimeZonePrivate();
549
550 QWinTimeZonePrivate *clone() const override;
551
552 QString comment() const override;
553
554 using QTimeZonePrivate::displayName;
555 QString displayName(QTimeZone::TimeType timeType, QTimeZone::NameType nameType,
556 const QLocale &locale) const override;
557 QString abbreviation(qint64 atMSecsSinceEpoch) const override;
558
559 int offsetFromUtc(qint64 atMSecsSinceEpoch) const override;
560 int standardTimeOffset(qint64 atMSecsSinceEpoch) const override;
561 int daylightTimeOffset(qint64 atMSecsSinceEpoch) const override;
562
563 bool hasDaylightTime() const override;
564 bool isDaylightTime(qint64 atMSecsSinceEpoch) const override;
565
566 using QTimeZonePrivate::data;
567 Data data(qint64 forMSecsSinceEpoch) const override;
568
569 bool hasTransitions() const override;
570 Data nextTransition(qint64 afterMSecsSinceEpoch) const override;
571 Data previousTransition(qint64 beforeMSecsSinceEpoch) const override;
572
573 QByteArray systemTimeZoneId() const override;
574
575 QList<QByteArray> availableTimeZoneIds() const override;
576
577 // For use within implementation's TransitionTimePair:
578 QTimeZonePrivate::Data ruleToData(const QWinTransitionRule &rule, qint64 atMSecsSinceEpoch,
579 QTimeZone::TimeType type, bool fakeDst = false) const;
580private:
581 void init(const QByteArray &ianaId);
582
583 QByteArray m_windowsId;
584 QString m_displayName;
585 QString m_standardName;
586 QString m_daylightName;
587 QList<QWinTransitionRule> m_tranRules;
588};
589#endif // C++20, Darwin, Android, Unix, ICU, Win.
590
591QT_END_NAMESPACE
592
593#endif // QTIMEZONEPRIVATE_P_H
Definition qlist.h:82
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:1865
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)