8#if QT_CONFIG(timezone_locale)
17#include <private/qcalendarmath_p.h>
18#include <private/qnumeric_p.h>
19#include <private/qtools_p.h>
33 return less.windowsIdKey < more.windowsIdKey
34 || (less.windowsIdKey == more.windowsIdKey && less.territory < more.territory);
42 return less.windowsIdKey < more.windowsIdKey
49 return entry.offsetFromUtc < offsetSeconds;
54 return entry.windowsIdKey < winIdKey;
69 return entry.windowsIdKey < winIdKey;
79 return data->windowsIdKey;
91 return data.windowsId().toByteArray();
97 return data->windowsId().toByteArray();
148 return !(*
this ==
other);
180 QTimeZone::NameType nameType,
183 const Data tran =
data(atMSecsSinceEpoch);
187 if (nameType == QTimeZone::ShortName &&
isDataLocale(locale))
188 return tran.abbreviation;
190 QTimeZone::TimeType timeType
191 = tran.daylightTimeOffset != 0 ? QTimeZone::DaylightTime : QTimeZone::StandardTime;
192#if QT_CONFIG(timezone_locale)
193 return localeName(atMSecsSinceEpoch, tran.offsetFromUtc, timeType, nameType, locale);
202 QTimeZone::NameType nameType,
207 if (nameType == QTimeZone::OffsetName &&
isDataLocale(locale))
210#if QT_CONFIG(timezone_locale)
211 return localeName(tran.atMSecsSinceEpoch, tran.offsetFromUtc, timeType, nameType, locale);
258 && ((timeType == QTimeZone::DaylightTime) != (tran.daylightTimeOffset == 0));
264 if (validMatch(tran))
270 if (validMatch(tran))
280 if (validMatch(tran))
311 qint64 forLocalMSecs, QDateTimePrivate::TransitionOptions
resolve)
const
328 std::integral_constant<qint64, 17 * 3600 * 1000> seventeenHoursInMSecs;
338 qAddOverflow(forLocalMSecs, seventeenHoursInMSecs, &millis)
341 Q_ASSERT(recent < imminent && seventeenHoursInMSecs < imminent - recent + 1);
346 && past.standardTimeOffset ==
future.standardTimeOffset
348 && past.abbreviation ==
future.abbreviation)) {
350 data.atMSecsSinceEpoch = forLocalMSecs -
future.offsetFromUtc * 1000;
351 return dataToState(
data);
397 forLocalMSecs - tran.offsetFromUtc * 1000 >= tran.atMSecsSinceEpoch);
409 && forLocalMSecs > nextTran.atMSecsSinceEpoch + nextTran.offsetFromUtc * 1000) {
412 || newTran.atMSecsSinceEpoch + newTran.offsetFromUtc * 1000 > imminent) {
424 || forLocalMSecs - tran.offsetFromUtc * 1000 > tran.atMSecsSinceEpoch);
426 tran.atMSecsSinceEpoch = forLocalMSecs - tran.offsetFromUtc * 1000;
428 const qint64 nextStart = nextTran.atMSecsSinceEpoch;
430 return dataToState(tran);
443 nextTran.atMSecsSinceEpoch = forLocalMSecs - nextTran.offsetFromUtc * 1000;
445 bool fallBack =
false;
446 if (nextStart > nextTran.atMSecsSinceEpoch) {
448 if (nextStart > tran.atMSecsSinceEpoch)
449 return dataToState(tran);
451 Q_ASSERT(tran.offsetFromUtc < nextTran.offsetFromUtc);
453 }
else if (nextStart <= tran.atMSecsSinceEpoch) {
455 return dataToState(nextTran);
457 Q_ASSERT(nextTran.offsetFromUtc < tran.offsetFromUtc);
466 && (fallBack ? !tran.daylightTimeOffset && nextTran.daylightTimeOffset
467 : tran.daylightTimeOffset && !nextTran.daylightTimeOffset);
473 return dataToState(nextTran);
478 return dataToState(tran);
487 std::swap(tran.atMSecsSinceEpoch, nextTran.atMSecsSinceEpoch);
491 return dataToState(nextTran);
495 return dataToState(tran);
498 return {forLocalMSecs};
508 int early = past.offsetFromUtc;
509 int late =
future.offsetFromUtc;
513 return {forLocalMSecs};
517 const qint64 forEarly = forLocalMSecs - early * 1000;
518 const qint64 forLate = forLocalMSecs - late * 1000;
529 utcEpochMSecs = forEarly;
531 utcEpochMSecs = forLate;
533 return {forLocalMSecs};
536 utcEpochMSecs = forEarly;
540 utcEpochMSecs = forLate;
544 const int dstStep = (late - early) * 1000;
546 utcEpochMSecs = forEarly - dstStep;
548 utcEpochMSecs = forLate + dstStep;
550 return {forLocalMSecs};
554 return dataToState(
data(utcEpochMSecs));
575 qint64 toMSecsSinceEpoch)
const
578 if (toMSecsSinceEpoch >= fromMSecsSinceEpoch) {
582 &&
next.atMSecsSinceEpoch <= toMSecsSinceEpoch) {
600 return std::binary_search(tzIds.begin(), tzIds.end(), ianaId);
605 return QList<QByteArray>();
609 const QList<QByteArray> &all)
611 std::sort(desired.begin(), desired.end());
612 const auto newEnd = std::unique(desired.begin(), desired.end());
613 const auto newSize = std::distance(desired.begin(), newEnd);
616 std::set_intersection(all.begin(), all.end(), desired.cbegin(),
617 std::next(desired.cbegin(), newSize), std::back_inserter(
result));
624 QList<QByteArrayView> regions;
629 for (
auto l1 :
data.ids())
646 for (
auto l1 :
data->ids())
654#ifndef QT_NO_DATASTREAM
677 data.offsetFromUtc,
data.standardTimeOffset,
data.daylightTimeOffset };
723 const int MinSectionLength = 1;
724#if defined(Q_OS_ANDROID) || QT_CONFIG(icu)
727 const int MaxSectionLength = 17;
729 const int MaxSectionLength = 14;
731 int sectionLength = 0;
732 for (
const char *
it = ianaId.
begin(), *
const end = ianaId.
end();
it !=
end; ++
it, ++sectionLength) {
735 if (sectionLength < MinSectionLength || sectionLength > MaxSectionLength)
738 }
else if (
ch ==
'-') {
739 if (sectionLength == 0)
752 if (sectionLength < MinSectionLength || sectionLength > MaxSectionLength)
771 if (
mode != QTimeZone::ShortName || secs || mins)
773 if (
mode == QTimeZone::LongName || secs)
783 return data->ianaId().toByteArray();
795 for (
auto l1 :
data.ids()) {
826 QList<QByteArray>
list;
831 for (
auto l1 :
data->ids())
843 QList<QByteArray>
list;
850 if (
data->territory == land) {
851 for (
auto l1 :
data->ids())
869 while ((
cut = ianaIds.indexOf(
' ')) >= 0) {
870 if (
id == ianaIds.first(
cut))
872 ianaIds = ianaIds.sliced(
cut + 1);
874 return id == ianaIds;
910 if (!
id.startsWith(
"UTC") ||
id.
size() < 5)
911 return invalidSeconds();
912 const char signChar =
id.at(3);
913 if (signChar !=
'-' && signChar !=
'+')
914 return invalidSeconds();
915 const int sign = signChar ==
'-' ? -1 : 1;
921 unsigned short field =
offset.toUShort(&
ok);
923 if (!
ok || field >= (prior ? 60 : 24))
924 return invalidSeconds();
925 seconds = seconds * 60 + field;
927 return invalidSeconds();
931 return invalidSeconds();
936 return seconds *
sign;
950 id = (
cut < 0 ? ianaId : ianaId.
first(
cut)).toByteArray();
954 name = isoOffsetFormat(offsetSeconds, QTimeZone::ShortName);
964 init(zoneId, offsetSeconds,
name, abbreviation, territory, comment);
969 m_abbreviation(
other.m_abbreviation),
970 m_comment(
other.m_comment),
971 m_territory(
other.m_territory),
972 m_offsetFromUtc(
other.m_offsetFromUtc)
989 d.atMSecsSinceEpoch = forMSecsSinceEpoch;
990 d.standardTimeOffset =
d.offsetFromUtc = m_offsetFromUtc;
991 d.daylightTimeOffset = 0;
1008void QUtcTimeZonePrivate::init(
const QByteArray &zoneId)
1018 m_offsetFromUtc = offsetSeconds;
1037 QTimeZone::NameType nameType,
1041 return displayName(QTimeZone::StandardTime, nameType, locale);
1045 QTimeZone::NameType nameType,
1050 if (nameType == QTimeZone::ShortName)
1051 return m_abbreviation;
1052 else if (nameType == QTimeZone::OffsetName)
1060 return m_abbreviation;
1066 return m_offsetFromUtc;
1096 QList<QByteArray>
result;
1103 id =
id.sliced(
cut + 1);
1105 result <<
id.toByteArray();
1118 return QList<QByteArray>();
1125 QList<QByteArray>
result;
1133 id =
id.sliced(
cut + 1);
1135 result <<
id.toByteArray();
1149#ifndef QT_NO_DATASTREAM
1153 << m_abbreviation << static_cast<qint32>(m_territory) << m_comment;
QByteArray toByteArray() const
constexpr QByteArrayView first(qsizetype n) const
qsizetype indexOf(QByteArrayView a, qsizetype from=0) const noexcept
char * data()
\macro QT_NO_CAST_FROM_BYTEARRAY
qsizetype size() const noexcept
Returns the number of bytes in this byte array.
iterator end()
Returns an \l{STL-style iterators}{STL-style iterator} pointing just after the last byte in the byte-...
bool isEmpty() const noexcept
Returns true if the byte array has size 0; otherwise returns false.
iterator begin()
Returns an \l{STL-style iterators}{STL-style iterator} pointing to the first byte in the byte-array.
\inmodule QtCore\reentrant
\inmodule QtCore\reentrant
static QDateTime fromMSecsSinceEpoch(qint64 msecs, const QTimeZone &timeZone)
static qint64 currentMSecsSinceEpoch() noexcept
constexpr auto tokenize(Needle &&needle, Flags...flags) const noexcept(noexcept(qTokenize(std::declval< const QLatin1StringView & >(), std::forward< Needle >(needle), flags...))) -> decltype(qTokenize(*this, std::forward< Needle >(needle), flags...))
qsizetype size() const noexcept
void append(parameter_type t)
Language language() const
Returns the language of this locale.
static QLocale c()
Returns a QLocale object initialized to the "C" locale.
static QLocale system()
Returns a QLocale object initialized to the system locale.
\macro QT_RESTRICTED_CAST_FROM_ASCII
static QString fromUtf8(QByteArrayView utf8)
This is an overloaded member function, provided for convenience. It differs from the above function o...
static QString static QString asprintf(const char *format,...) Q_ATTRIBUTE_FORMAT_PRINTF(1
virtual bool hasDaylightTime() const
virtual bool isDaylightTime(qint64 atMSecsSinceEpoch) const
static QByteArray utcQByteArray()
static QByteArray aliasToIana(QByteArrayView alias)
virtual QTimeZonePrivate * clone() const
static QByteArray windowsIdToDefaultIanaId(const QByteArray &windowsId)
virtual bool isDataLocale(const QLocale &locale) const
virtual Data nextTransition(qint64 afterMSecsSinceEpoch) const
virtual Data data(qint64 forMSecsSinceEpoch) const
virtual bool hasTransitions() const
virtual ~QTimeZonePrivate()
virtual Data previousTransition(qint64 beforeMSecsSinceEpoch) const
virtual QString displayName(qint64 atMSecsSinceEpoch, QTimeZone::NameType nameType, const QLocale &locale) const
bool operator==(const QTimeZonePrivate &other) const
QDateTimePrivate::ZoneState stateAtZoneTime(qint64 forLocalMSecs, QDateTimePrivate::TransitionOptions resolve) const
virtual int daylightTimeOffset(qint64 atMSecsSinceEpoch) const
bool operator!=(const QTimeZonePrivate &other) const
static constexpr qint64 invalidMSecs()
virtual bool isTimeZoneIdAvailable(const QByteArray &ianaId) const
virtual QLocale::Territory territory() const
virtual QString comment() const
static constexpr qint64 maxMSecs()
virtual void serialize(QDataStream &ds) const
static QList< QByteArray > windowsIdToIanaIds(const QByteArray &windowsId)
virtual QList< QByteArray > availableTimeZoneIds() const
virtual QString abbreviation(qint64 atMSecsSinceEpoch) const
static QTimeZone::OffsetData toOffsetData(const Data &data)
DataList transitions(qint64 fromMSecsSinceEpoch, qint64 toMSecsSinceEpoch) const
virtual int standardTimeOffset(qint64 atMSecsSinceEpoch) const
static QByteArray ianaIdToWindowsId(const QByteArray &ianaId)
static QString isoOffsetFormat(int offsetFromUtc, QTimeZone::NameType mode=QTimeZone::OffsetName)
static constexpr qint64 minMSecs()
virtual int offsetFromUtc(qint64 atMSecsSinceEpoch) const
static QTimeZone::OffsetData invalidOffsetData()
static constexpr qint64 invalidSeconds()
static QString utcQString()
virtual QByteArray systemTimeZoneId() const
static bool isValidId(const QByteArray &ianaId)
static constexpr int MaxUtcOffsetSecs
static constexpr int MinUtcOffsetSecs
QUtcTimeZonePrivate * clone() const override
int standardTimeOffset(qint64 atMSecsSinceEpoch) const override
QList< QByteArray > availableTimeZoneIds() const override
bool isDataLocale(const QLocale &locale) const override
static qint64 offsetFromUtcString(QByteArrayView id)
bool isTimeZoneIdAvailable(const QByteArray &ianaId) const override
QLocale::Territory territory() const override
QString abbreviation(qint64 atMSecsSinceEpoch) const override
virtual ~QUtcTimeZonePrivate()
Data data(qint64 forMSecsSinceEpoch) const override
void serialize(QDataStream &ds) const override
QString displayName(qint64 atMSecsSinceEpoch, QTimeZone::NameType nameType, const QLocale &locale) const override
QString comment() const override
int daylightTimeOffset(qint64 atMSecsSinceEpoch) const override
QByteArray systemTimeZoneId() const override
QSet< QString >::iterator it
Combined button and popup list for selecting options.
constexpr bool isAsciiDigit(char32_t c) noexcept
constexpr bool isAsciiLower(char32_t c) noexcept
constexpr bool isAsciiUpper(char32_t c) noexcept
static constexpr WindowsData windowsDataTable[]
static constexpr ZoneData zoneDataTable[]
static constexpr UtcData utcDataTable[]
static constexpr AliasData aliasMappingTable[]
static jboolean cut(JNIEnv *, jobject)
typedef QByteArray(EGLAPIENTRYP PFNQGSGETDISPLAYSPROC)()
QT_BEGIN_NAMESPACE constexpr const T & qMin(const T &a, const T &b)
std::enable_if_t< std::is_unsigned_v< T >, bool > qAddOverflow(T v1, T v2, T *r)
std::enable_if_t< std::is_unsigned_v< T >, bool > qSubOverflow(T v1, T v2, T *r)
GLenum GLuint GLintptr GLsizeiptr size
[1]
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLenum GLuint GLintptr offset
GLuint GLsizei const GLuint const GLintptr * offsets
static const QQmlJSScope * resolve(const QQmlJSScope *current, const QStringList &names)
QBasicUtf8StringView< false > QUtf8StringView
#define QStringLiteral(str)
static QT_BEGIN_NAMESPACE void init(QTextBoundaryFinder::BoundaryType type, QStringView str, QCharAttributes *attributes)
constexpr bool atLowerWindowsKey(WindowsData entry, qint16 winIdKey) noexcept
static bool earlierAliasId(AliasData entry, QByteArrayView aliasId) noexcept
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 QList< QByteArray > selectAvailable(QList< QByteArrayView > &&desired, const QList< QByteArray > &all)
static quint16 toWindowsIdKey(const QByteArray &winId)
static QByteArray 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
QFuture< void > future
[5]