Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
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
5
6#ifndef QTIMEZONEPRIVATE_P_H
7#define QTIMEZONEPRIVATE_P_H
8
9//
10// W A R N I N G
11// -------------
12//
13// This file is not part of the Qt API. It exists for the convenience
14// of internal files. This header file may change from version to version
15// without notice, or even be removed.
16//
17// We mean it.
18//
19
20#include "qlist.h"
21#include "qtimezone.h"
22#include "private/qlocale_p.h"
23#include "private/qdatetime_p.h"
24
25#if QT_CONFIG(icu)
26#include <unicode/ucal.h>
27#endif
28
29#ifdef Q_OS_DARWIN
31#endif // Q_OS_DARWIN
32
33#ifdef Q_OS_WIN
34#include <qt_windows.h>
35#endif // Q_OS_WIN
36
37#ifdef Q_OS_ANDROID
38#include <QJniObject>
39#endif
40
43
45{
46public:
47 // Version of QTimeZone::OffsetData struct using msecs for efficiency
48 struct Data {
55 : atMSecsSinceEpoch(QTimeZonePrivate::invalidMSecs()),
56 offsetFromUtc(QTimeZonePrivate::invalidSeconds()),
57 standardTimeOffset(QTimeZonePrivate::invalidSeconds()),
58 daylightTimeOffset(QTimeZonePrivate::invalidSeconds())
59 {}
60 Data(const QString &name, qint64 when, int offset, int standard)
61 : abbreviation(name),
62 atMSecsSinceEpoch(when),
63 offsetFromUtc(offset),
64 standardTimeOffset(standard),
65 daylightTimeOffset(offset - standard)
66 {}
67 };
68 typedef QList<Data> DataList;
69
70 // Create null time zone
73 virtual ~QTimeZonePrivate();
74
75 virtual QTimeZonePrivate *clone() const;
76
77 bool operator==(const QTimeZonePrivate &other) const;
78 bool operator!=(const QTimeZonePrivate &other) const;
79
80 bool isValid() const;
81
82 QByteArray id() const;
83 virtual QLocale::Territory territory() const;
84 virtual QString comment() const;
85
86 virtual QString displayName(qint64 atMSecsSinceEpoch,
87 QTimeZone::NameType nameType,
88 const QLocale &locale) const;
89 virtual QString displayName(QTimeZone::TimeType timeType,
90 QTimeZone::NameType nameType,
91 const QLocale &locale) const;
92 virtual QString abbreviation(qint64 atMSecsSinceEpoch) const;
93
94 virtual int offsetFromUtc(qint64 atMSecsSinceEpoch) const;
95 virtual int standardTimeOffset(qint64 atMSecsSinceEpoch) const;
96 virtual int daylightTimeOffset(qint64 atMSecsSinceEpoch) const;
97
98 virtual bool hasDaylightTime() const;
99 virtual bool isDaylightTime(qint64 atMSecsSinceEpoch) const;
100
101 virtual Data data(qint64 forMSecsSinceEpoch) const;
102 virtual Data data(QTimeZone::TimeType timeType) const;
103 virtual bool isDataLocale(const QLocale &locale) const;
104 QDateTimePrivate::ZoneState stateAtZoneTime(qint64 forLocalMSecs,
105 QDateTimePrivate::TransitionOptions resolve) const;
106
107 virtual bool hasTransitions() const;
108 virtual Data nextTransition(qint64 afterMSecsSinceEpoch) const;
109 virtual Data previousTransition(qint64 beforeMSecsSinceEpoch) const;
110 DataList transitions(qint64 fromMSecsSinceEpoch, qint64 toMSecsSinceEpoch) const;
111
112 virtual QByteArray systemTimeZoneId() const;
113
114 virtual bool isTimeZoneIdAvailable(const QByteArray &ianaId) const;
115 virtual QList<QByteArray> availableTimeZoneIds() const;
116 virtual QList<QByteArray> availableTimeZoneIds(QLocale::Territory territory) const;
117 virtual QList<QByteArray> availableTimeZoneIds(int utcOffset) const;
118
119 virtual void serialize(QDataStream &ds) const;
120
121 // Static Utility Methods
122 [[nodiscard]] static constexpr qint64 maxMSecs()
123 { return (std::numeric_limits<qint64>::max)(); }
124 [[nodiscard]] static constexpr qint64 minMSecs()
125 { return (std::numeric_limits<qint64>::min)() + 1; }
126 [[nodiscard]] static constexpr qint64 invalidMSecs()
127 { return (std::numeric_limits<qint64>::min)(); }
128 [[nodiscard]] static constexpr qint64 invalidSeconds()
129 { return (std::numeric_limits<int>::min)(); }
130 static QTimeZone::OffsetData invalidOffsetData();
131 static QTimeZone::OffsetData toOffsetData(const Data &data);
132 static bool isValidId(const QByteArray &ianaId);
133 static QString isoOffsetFormat(int offsetFromUtc,
134 QTimeZone::NameType mode = QTimeZone::OffsetName);
135
136 static QByteArray aliasToIana(QByteArrayView alias);
137 static QByteArray ianaIdToWindowsId(const QByteArray &ianaId);
138 static QByteArray windowsIdToDefaultIanaId(const QByteArray &windowsId);
139 static QByteArray windowsIdToDefaultIanaId(const QByteArray &windowsId,
140 QLocale::Territory territory);
141 static QList<QByteArray> windowsIdToIanaIds(const QByteArray &windowsId);
142 static QList<QByteArray> windowsIdToIanaIds(const QByteArray &windowsId,
143 QLocale::Territory territory);
144
145 // returns "UTC" QString and QByteArray
146 [[nodiscard]] static inline QString utcQString()
147 {
148 return QStringLiteral("UTC");
149 }
150
151 [[nodiscard]] static inline QByteArray utcQByteArray()
152 {
153 return QByteArrayLiteral("UTC");
154 }
155
156#if QT_CONFIG(timezone_locale)
157private:
158 // Defined in qtimezonelocale.cpp
159 QString localeName(qint64 atMSecsSinceEpoch, int offsetFromUtc,
160 QTimeZone::TimeType timeType,
161 QTimeZone::NameType nameType,
162 const QLocale &locale) const;
163#endif // L10n helpers.
164
165protected:
167};
169
171
173{
174public:
175 // Create default UTC time zone
177 // Create named time zone
178 QUtcTimeZonePrivate(const QByteArray &utcId);
179 // Create offset from UTC
180 QUtcTimeZonePrivate(qint32 offsetSeconds);
181 // Create custom offset from UTC
182 QUtcTimeZonePrivate(const QByteArray &zoneId, int offsetSeconds, const QString &name,
183 const QString &abbreviation, QLocale::Territory territory,
184 const QString &comment);
186 virtual ~QUtcTimeZonePrivate();
187
188 // Fall-back for UTC[+-]\d+(:\d+){,2} IDs.
189 static qint64 offsetFromUtcString(QByteArrayView id);
190
191 QUtcTimeZonePrivate *clone() const override;
192
193 Data data(qint64 forMSecsSinceEpoch) const override;
194 Data data(QTimeZone::TimeType timeType) const override;
195 bool isDataLocale(const QLocale &locale) const override;
196
197 QLocale::Territory territory() const override;
198 QString comment() const override;
199
200 QString displayName(qint64 atMSecsSinceEpoch,
201 QTimeZone::NameType nameType,
202 const QLocale &locale) const override;
203 QString displayName(QTimeZone::TimeType timeType,
204 QTimeZone::NameType nameType,
205 const QLocale &locale) const override;
206 QString abbreviation(qint64 atMSecsSinceEpoch) const override;
207
208 int standardTimeOffset(qint64 atMSecsSinceEpoch) const override;
209 int daylightTimeOffset(qint64 atMSecsSinceEpoch) const override;
210
211 QByteArray systemTimeZoneId() const override;
212
213 bool isTimeZoneIdAvailable(const QByteArray &ianaId) const override;
214 QList<QByteArray> availableTimeZoneIds() const override;
215 QList<QByteArray> availableTimeZoneIds(QLocale::Territory country) const override;
216 QList<QByteArray> availableTimeZoneIds(int utcOffset) const override;
217
218 void serialize(QDataStream &ds) const override;
219
220private:
221 void init(const QByteArray &zoneId);
222 void init(const QByteArray &zoneId, int offsetSeconds, const QString &name,
223 const QString &abbreviation, QLocale::Territory territory,
224 const QString &comment);
225
226 QString m_name;
227 QString m_abbreviation;
228 QString m_comment;
229 QLocale::Territory m_territory;
230 int m_offsetFromUtc;
231};
232
233// TODO: shuffle (almost reverse) order of and rework #if-ery here to use #elif
234// and match the #if-ery in each of QTZ's newBackendTimeZone() cascades for
235// backend selection.
236#if QT_CONFIG(icu) && !defined(Q_OS_UNIX)
237class Q_AUTOTEST_EXPORT QIcuTimeZonePrivate final : public QTimeZonePrivate
238{
239public:
240 // Create default time zone
241 QIcuTimeZonePrivate();
242 // Create named time zone
243 QIcuTimeZonePrivate(const QByteArray &ianaId);
244 QIcuTimeZonePrivate(const QIcuTimeZonePrivate &other);
245 ~QIcuTimeZonePrivate();
246
247 QIcuTimeZonePrivate *clone() const override;
248
250 QString displayName(QTimeZone::TimeType timeType, QTimeZone::NameType nameType,
251 const QLocale &locale) const override;
252
253 int offsetFromUtc(qint64 atMSecsSinceEpoch) const override;
254 int standardTimeOffset(qint64 atMSecsSinceEpoch) const override;
255 int daylightTimeOffset(qint64 atMSecsSinceEpoch) const override;
256
257 bool hasDaylightTime() const override;
258 bool isDaylightTime(qint64 atMSecsSinceEpoch) const override;
259
261 Data data(qint64 forMSecsSinceEpoch) const override;
262
263 bool hasTransitions() const override;
264 Data nextTransition(qint64 afterMSecsSinceEpoch) const override;
265 Data previousTransition(qint64 beforeMSecsSinceEpoch) const override;
266
267 QByteArray systemTimeZoneId() const override;
268
269 bool isTimeZoneIdAvailable(const QByteArray &ianaId) const override;
270 QList<QByteArray> availableTimeZoneIds() const override;
271 QList<QByteArray> availableTimeZoneIds(QLocale::Territory territory) const override;
272 QList<QByteArray> availableTimeZoneIds(int offsetFromUtc) const override;
273
274private:
275 void init(const QByteArray &ianaId);
276
277 UCalendar *m_ucal;
278};
279#endif // ICU not on Unix.
280
281#if defined(Q_OS_UNIX) && !defined(Q_OS_DARWIN) && !defined(Q_OS_ANDROID)
282struct QTzTransitionTime
283{
284 qint64 atMSecsSinceEpoch;
285 quint8 ruleIndex;
286};
287Q_DECLARE_TYPEINFO(QTzTransitionTime, Q_PRIMITIVE_TYPE);
288struct QTzTransitionRule
289{
290 int stdOffset = 0;
291 int dstOffset = 0;
292 quint8 abbreviationIndex = 0;
293};
294Q_DECLARE_TYPEINFO(QTzTransitionRule, Q_PRIMITIVE_TYPE);
295constexpr inline bool operator==(const QTzTransitionRule &lhs, const QTzTransitionRule &rhs) noexcept
296{ return lhs.stdOffset == rhs.stdOffset && lhs.dstOffset == rhs.dstOffset && lhs.abbreviationIndex == rhs.abbreviationIndex; }
297constexpr inline bool operator!=(const QTzTransitionRule &lhs, const QTzTransitionRule &rhs) noexcept
298{ return !operator==(lhs, rhs); }
299
300// These are stored separately from QTzTimeZonePrivate so that they can be
301// cached, avoiding the need to re-parse them from disk constantly.
302struct QTzTimeZoneCacheEntry
303{
304 QList<QTzTransitionTime> m_tranTimes;
305 QList<QTzTransitionRule> m_tranRules;
306 QList<QByteArray> m_abbreviations;
307 QByteArray m_posixRule;
308 QTzTransitionRule m_preZoneRule;
309 bool m_hasDst = false;
310};
311
312class Q_AUTOTEST_EXPORT QTzTimeZonePrivate final : public QTimeZonePrivate
313{
314 QTzTimeZonePrivate(const QTzTimeZonePrivate &) = default;
315public:
316 // Create default time zone
317 QTzTimeZonePrivate();
318 // Create named time zone
319 QTzTimeZonePrivate(const QByteArray &ianaId);
320 ~QTzTimeZonePrivate();
321
322 QTzTimeZonePrivate *clone() const override;
323
324 QLocale::Territory territory() const override;
325 QString comment() const override;
326
328 QString displayName(QTimeZone::TimeType timeType,
329 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 Data data(qint64 forMSecsSinceEpoch) const override;
341 Data data(QTimeZone::TimeType timeType) const override;
342 bool isDataLocale(const QLocale &locale) const override;
343
344 bool hasTransitions() const override;
345 Data nextTransition(qint64 afterMSecsSinceEpoch) const override;
346 Data previousTransition(qint64 beforeMSecsSinceEpoch) const override;
347
348 QByteArray systemTimeZoneId() const override;
349
350 bool isTimeZoneIdAvailable(const QByteArray &ianaId) const override;
351 QList<QByteArray> availableTimeZoneIds() const override;
352 QList<QByteArray> availableTimeZoneIds(QLocale::Territory territory) const override;
353
354private:
355 static QByteArray staticSystemTimeZoneId();
356 QList<QTimeZonePrivate::Data> getPosixTransitions(qint64 msNear) const;
357
358 Data dataForTzTransition(QTzTransitionTime tran) const;
359 Data dataFromRule(QTzTransitionRule rule, qint64 msecsSinceEpoch) const;
360 QTzTimeZoneCacheEntry cached_data;
361 const QList<QTzTransitionTime> &tranCache() const { return cached_data.m_tranTimes; }
362};
363#endif // Q_OS_UNIX
364
365#ifdef Q_OS_DARWIN
366class Q_AUTOTEST_EXPORT QMacTimeZonePrivate final : public QTimeZonePrivate
367{
368public:
369 // Create default time zone
370 QMacTimeZonePrivate();
371 // Create named time zone
372 QMacTimeZonePrivate(const QByteArray &ianaId);
373 QMacTimeZonePrivate(const QMacTimeZonePrivate &other);
374 ~QMacTimeZonePrivate();
375
376 QMacTimeZonePrivate *clone() const override;
377
378 QString comment() const override;
379
381 QString displayName(QTimeZone::TimeType timeType, QTimeZone::NameType nameType,
382 const QLocale &locale) const override;
383 QString abbreviation(qint64 atMSecsSinceEpoch) const override;
384
385 int offsetFromUtc(qint64 atMSecsSinceEpoch) const override;
386 int standardTimeOffset(qint64 atMSecsSinceEpoch) const override;
387 int daylightTimeOffset(qint64 atMSecsSinceEpoch) const override;
388
389 bool hasDaylightTime() const override;
390 bool isDaylightTime(qint64 atMSecsSinceEpoch) const override;
391
393 Data data(qint64 forMSecsSinceEpoch) const override;
394
395 bool hasTransitions() const override;
396 Data nextTransition(qint64 afterMSecsSinceEpoch) const override;
397 Data previousTransition(qint64 beforeMSecsSinceEpoch) const override;
398
399 QByteArray systemTimeZoneId() const override;
400 bool isTimeZoneIdAvailable(const QByteArray &ianaId) const override;
401 QList<QByteArray> availableTimeZoneIds() const override;
402
403 NSTimeZone *nsTimeZone() const;
404
405private:
406 void init(const QByteArray &zoneId);
407
408 NSTimeZone *m_nstz;
409};
410#endif // Q_OS_DARWIN
411
412#if defined(Q_OS_WIN) && !QT_CONFIG(icu)
413class Q_AUTOTEST_EXPORT QWinTimeZonePrivate final : public QTimeZonePrivate
414{
415public:
416 struct QWinTransitionRule {
417 int startYear;
418 int standardTimeBias;
419 int daylightTimeBias;
420 SYSTEMTIME standardTimeRule;
421 SYSTEMTIME daylightTimeRule;
422 };
423
424 // Create default time zone
425 QWinTimeZonePrivate();
426 // Create named time zone
427 QWinTimeZonePrivate(const QByteArray &ianaId);
428 QWinTimeZonePrivate(const QWinTimeZonePrivate &other);
429 ~QWinTimeZonePrivate();
430
431 QWinTimeZonePrivate *clone() const override;
432
433 QString comment() const override;
434
436 QString displayName(QTimeZone::TimeType timeType, QTimeZone::NameType nameType,
437 const QLocale &locale) const override;
438 QString abbreviation(qint64 atMSecsSinceEpoch) const override;
439
440 int offsetFromUtc(qint64 atMSecsSinceEpoch) const override;
441 int standardTimeOffset(qint64 atMSecsSinceEpoch) const override;
442 int daylightTimeOffset(qint64 atMSecsSinceEpoch) const override;
443
444 bool hasDaylightTime() const override;
445 bool isDaylightTime(qint64 atMSecsSinceEpoch) const override;
446
448 Data data(qint64 forMSecsSinceEpoch) const override;
449
450 bool hasTransitions() const override;
451 Data nextTransition(qint64 afterMSecsSinceEpoch) const override;
452 Data previousTransition(qint64 beforeMSecsSinceEpoch) const override;
453
454 QByteArray systemTimeZoneId() const override;
455
456 QList<QByteArray> availableTimeZoneIds() const override;
457
458 // For use within implementation's TransitionTimePair:
459 QTimeZonePrivate::Data ruleToData(const QWinTransitionRule &rule, qint64 atMSecsSinceEpoch,
460 QTimeZone::TimeType type, bool fakeDst = false) const;
461private:
462 void init(const QByteArray &ianaId);
463
464 QByteArray m_windowsId;
465 QString m_displayName;
466 QString m_standardName;
467 QString m_daylightName;
468 QList<QWinTransitionRule> m_tranRules;
469};
470#endif // Q_OS_WIN && !icu
471
472#ifdef Q_OS_ANDROID
473class QAndroidTimeZonePrivate final : public QTimeZonePrivate
474{
475public:
476 // Create default time zone
477 QAndroidTimeZonePrivate();
478 // Create named time zone
479 QAndroidTimeZonePrivate(const QByteArray &ianaId);
480 QAndroidTimeZonePrivate(const QAndroidTimeZonePrivate &other);
481 ~QAndroidTimeZonePrivate();
482
483 QAndroidTimeZonePrivate *clone() const override;
484
486 QString displayName(QTimeZone::TimeType timeType, QTimeZone::NameType nameType,
487 const QLocale &locale) const override;
488 QString abbreviation(qint64 atMSecsSinceEpoch) const override;
489
490 int offsetFromUtc(qint64 atMSecsSinceEpoch) const override;
491 int standardTimeOffset(qint64 atMSecsSinceEpoch) const override;
492 int daylightTimeOffset(qint64 atMSecsSinceEpoch) const override;
493
494 bool hasDaylightTime() const override;
495 bool isDaylightTime(qint64 atMSecsSinceEpoch) const override;
496
498 Data data(qint64 forMSecsSinceEpoch) const override;
499
500 QByteArray systemTimeZoneId() const override;
501 bool isTimeZoneIdAvailable(const QByteArray &ianaId) const override;
502 QList<QByteArray> availableTimeZoneIds() const override;
503
504private:
505 void init(const QByteArray &zoneId);
506
507 QJniObject androidTimeZone;
508
509};
510#endif // Q_OS_ANDROID
511
513
514#endif // QTIMEZONEPRIVATE_P_H
\inmodule QtCore
Definition qbytearray.h:57
\inmodule QtCore\reentrant
Definition qdatastream.h:46
\inmodule QtCore
\inmodule QtCore
Definition qshareddata.h:19
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
static QByteArray utcQByteArray()
virtual Data data(qint64 forMSecsSinceEpoch) const
QList< Data > DataList
virtual QString displayName(qint64 atMSecsSinceEpoch, QTimeZone::NameType nameType, const QLocale &locale) const
static constexpr qint64 invalidMSecs()
static constexpr qint64 maxMSecs()
static constexpr qint64 minMSecs()
static constexpr qint64 invalidSeconds()
static QString utcQString()
Combined button and popup list for selecting options.
#define QByteArrayLiteral(str)
Definition qbytearray.h:52
static QString displayName(CGDirectDisplayID displayID)
constexpr bool operator!=(const timespec &t1, const timespec &t2)
#define Q_FORWARD_DECLARE_OBJC_CLASS(classname)
DBusConnection const char * rule
GLenum mode
GLenum GLuint id
[7]
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLenum type
GLenum GLuint GLintptr offset
GLuint name
static const QQmlJSScope * resolve(const QQmlJSScope *current, const QStringList &names)
bool operator==(const QRandomGenerator &rng1, const QRandomGenerator &rng2)
Definition qrandom.cpp:1220
#define QStringLiteral(str)
#define Q_AUTOTEST_EXPORT
#define QT_REQUIRE_CONFIG(feature)
static QT_BEGIN_NAMESPACE void init(QTextBoundaryFinder::BoundaryType type, QStringView str, QCharAttributes *attributes)
@ Q_PRIMITIVE_TYPE
Definition qtypeinfo.h:157
@ Q_RELOCATABLE_TYPE
Definition qtypeinfo.h:158
#define Q_DECLARE_TYPEINFO(TYPE, FLAGS)
Definition qtypeinfo.h:180
int qint32
Definition qtypes.h:49
long long qint64
Definition qtypes.h:60
unsigned char quint8
Definition qtypes.h:46
QSharedPointer< T > other(t)
[5]
Data(const QString &name, qint64 when, int offset, int standard)