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