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