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;
64 return entry.windowsIdKey < winIdKey;
74 return data->windowsIdKey;
86 return data.windowsId().toByteArray();
92 return data->windowsId().toByteArray();
143 return !(*
this ==
other);
175 QTimeZone::NameType nameType,
178 const Data tran =
data(atMSecsSinceEpoch);
180 if (nameType == QTimeZone::OffsetName && locale.language() ==
QLocale::C)
182 if (nameType == QTimeZone::ShortName &&
isDataLocale(locale))
183 return tran.abbreviation;
185 QTimeZone::TimeType timeType
186 = tran.daylightTimeOffset != 0 ? QTimeZone::DaylightTime : QTimeZone::StandardTime;
187#if QT_CONFIG(timezone_locale)
188 return localeName(atMSecsSinceEpoch, tran.offsetFromUtc, timeType, nameType, locale);
197 QTimeZone::NameType nameType,
202 if (nameType == QTimeZone::OffsetName &&
isDataLocale(locale))
205#if QT_CONFIG(timezone_locale)
206 return localeName(tran.atMSecsSinceEpoch, tran.offsetFromUtc, timeType, nameType, locale);
253 && ((timeType == QTimeZone::DaylightTime) != (tran.daylightTimeOffset == 0));
259 if (validMatch(tran))
265 if (validMatch(tran))
275 if (validMatch(tran))
306 qint64 forLocalMSecs, QDateTimePrivate::TransitionOptions
resolve)
const
323 std::integral_constant<qint64, 17 * 3600 * 1000> seventeenHoursInMSecs;
333 qAddOverflow(forLocalMSecs, seventeenHoursInMSecs, &millis)
336 Q_ASSERT(recent < imminent && seventeenHoursInMSecs < imminent - recent + 1);
341 && past.standardTimeOffset ==
future.standardTimeOffset
343 && past.abbreviation ==
future.abbreviation)) {
345 data.atMSecsSinceEpoch = forLocalMSecs -
future.offsetFromUtc * 1000;
346 return dataToState(
data);
392 forLocalMSecs - tran.offsetFromUtc * 1000 >= tran.atMSecsSinceEpoch);
404 && forLocalMSecs > nextTran.atMSecsSinceEpoch + nextTran.offsetFromUtc * 1000) {
407 || newTran.atMSecsSinceEpoch + newTran.offsetFromUtc * 1000 > imminent) {
419 || forLocalMSecs - tran.offsetFromUtc * 1000 > tran.atMSecsSinceEpoch);
421 tran.atMSecsSinceEpoch = forLocalMSecs - tran.offsetFromUtc * 1000;
423 const qint64 nextStart = nextTran.atMSecsSinceEpoch;
425 return dataToState(tran);
438 nextTran.atMSecsSinceEpoch = forLocalMSecs - nextTran.offsetFromUtc * 1000;
440 bool fallBack =
false;
441 if (nextStart > nextTran.atMSecsSinceEpoch) {
443 if (nextStart > tran.atMSecsSinceEpoch)
444 return dataToState(tran);
446 Q_ASSERT(tran.offsetFromUtc < nextTran.offsetFromUtc);
448 }
else if (nextStart <= tran.atMSecsSinceEpoch) {
450 return dataToState(nextTran);
452 Q_ASSERT(nextTran.offsetFromUtc < tran.offsetFromUtc);
461 && (fallBack ? !tran.daylightTimeOffset && nextTran.daylightTimeOffset
462 : tran.daylightTimeOffset && !nextTran.daylightTimeOffset);
468 return dataToState(nextTran);
473 return dataToState(tran);
482 std::swap(tran.atMSecsSinceEpoch, nextTran.atMSecsSinceEpoch);
486 return dataToState(nextTran);
490 return dataToState(tran);
493 return {forLocalMSecs};
503 int early = past.offsetFromUtc;
504 int late =
future.offsetFromUtc;
508 return {forLocalMSecs};
512 const qint64 forEarly = forLocalMSecs - early * 1000;
513 const qint64 forLate = forLocalMSecs - late * 1000;
524 utcEpochMSecs = forEarly;
526 utcEpochMSecs = forLate;
528 return {forLocalMSecs};
531 utcEpochMSecs = forEarly;
535 utcEpochMSecs = forLate;
539 const int dstStep = (late - early) * 1000;
541 utcEpochMSecs = forEarly - dstStep;
543 utcEpochMSecs = forLate + dstStep;
545 return {forLocalMSecs};
549 return dataToState(
data(utcEpochMSecs));
570 qint64 toMSecsSinceEpoch)
const
573 if (toMSecsSinceEpoch >= fromMSecsSinceEpoch) {
577 &&
next.atMSecsSinceEpoch <= toMSecsSinceEpoch) {
595 return std::binary_search(tzIds.begin(), tzIds.end(), ianaId);
600 return QList<QByteArray>();
603static QList<QByteArray>
selectAvailable(QList<QByteArray>&& desired,
const QList<QByteArray>& all)
605 std::sort(desired.begin(), desired.end());
606 const auto newEnd = std::unique(desired.begin(), desired.end());
607 const auto newSize = std::distance(desired.begin(), newEnd);
610 std::set_intersection(all.begin(), all.end(), desired.cbegin(),
611 std::next(desired.cbegin(), newSize), std::back_inserter(
result));
618 QList<QByteArray> regions;
623 for (
auto l1 :
data.ids())
640 for (
auto l1 :
data->ids())
648#ifndef QT_NO_DATASTREAM
671 data.offsetFromUtc,
data.standardTimeOffset,
data.daylightTimeOffset };
717 const int MinSectionLength = 1;
718#if defined(Q_OS_ANDROID) || QT_CONFIG(icu)
721 const int MaxSectionLength = 17;
723 const int MaxSectionLength = 14;
725 int sectionLength = 0;
726 for (
const char *
it = ianaId.
begin(), *
const end = ianaId.
end();
it !=
end; ++
it, ++sectionLength) {
729 if (sectionLength < MinSectionLength || sectionLength > MaxSectionLength)
732 }
else if (
ch ==
'-') {
733 if (sectionLength == 0)
746 if (sectionLength < MinSectionLength || sectionLength > MaxSectionLength)
765 if (
mode != QTimeZone::ShortName || secs || mins)
767 if (
mode == QTimeZone::LongName || secs)
777 for (
auto l1 :
data.ids()) {
808 QList<QByteArray>
list;
813 for (
auto l1 :
data->ids())
825 QList<QByteArray>
list;
832 if (
data->territory == land) {
833 for (
auto l1 :
data->ids())
851 while ((
cut = ianaIds.indexOf(
' ')) >= 0) {
852 if (
id == ianaIds.first(
cut))
854 ianaIds = ianaIds.sliced(
cut + 1);
856 return id == ianaIds;
892 if (!
id.startsWith(
"UTC") ||
id.
size() < 5)
893 return invalidSeconds();
894 const char signChar =
id.at(3);
895 if (signChar !=
'-' && signChar !=
'+')
896 return invalidSeconds();
897 const int sign = signChar ==
'-' ? -1 : 1;
903 unsigned short field =
offset.toUShort(&
ok);
905 if (!
ok || field >= (prior ? 60 : 24))
906 return invalidSeconds();
907 seconds = seconds * 60 + field;
909 return invalidSeconds();
913 return invalidSeconds();
918 return seconds *
sign;
932 id = (
cut < 0 ? ianaId : ianaId.
first(
cut)).toByteArray();
936 name = isoOffsetFormat(offsetSeconds, QTimeZone::ShortName);
946 init(zoneId, offsetSeconds,
name, abbreviation, territory, comment);
951 m_abbreviation(
other.m_abbreviation),
952 m_comment(
other.m_comment),
953 m_territory(
other.m_territory),
954 m_offsetFromUtc(
other.m_offsetFromUtc)
971 d.atMSecsSinceEpoch = forMSecsSinceEpoch;
972 d.standardTimeOffset =
d.offsetFromUtc = m_offsetFromUtc;
973 d.daylightTimeOffset = 0;
990void QUtcTimeZonePrivate::init(
const QByteArray &zoneId)
1000 m_offsetFromUtc = offsetSeconds;
1019 QTimeZone::NameType nameType,
1023 return displayName(QTimeZone::StandardTime, nameType, locale);
1027 QTimeZone::NameType nameType,
1032 if (nameType == QTimeZone::ShortName)
1033 return m_abbreviation;
1034 else if (nameType == QTimeZone::OffsetName)
1042 return m_abbreviation;
1048 return m_offsetFromUtc;
1078 QList<QByteArray>
result;
1085 id =
id.sliced(
cut + 1);
1087 result <<
id.toByteArray();
1100 return QList<QByteArray>();
1107 QList<QByteArray>
result;
1115 id =
id.sliced(
cut + 1);
1117 result <<
id.toByteArray();
1131#ifndef QT_NO_DATASTREAM
1135 << 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)
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()
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 jboolean cut(JNIEnv *, jobject)
typedef QByteArray(EGLAPIENTRYP PFNQGSGETDISPLAYSPROC)()
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)
static bool earlierWindowsId(const WindowsData &entry, QByteArrayView winId) noexcept
static QList< QByteArray > selectAvailable(QList< QByteArray > &&desired, const QList< QByteArray > &all)
constexpr bool zoneAtLowerWindowsKey(const ZoneData &entry, qint16 winIdKey) noexcept
static bool isEntryInIanaList(QByteArrayView id, QByteArrayView ianaIds)
static auto zoneStartForWindowsId(quint16 windowsIdKey) noexcept
static bool earlierWinData(const WindowsData &less, const WindowsData &more) noexcept
constexpr bool atLowerUtcOffset(const UtcData &entry, qint32 offsetSeconds) noexcept
constexpr bool atLowerWindowsKey(const WindowsData &entry, qint16 winIdKey) noexcept
static quint16 toWindowsIdKey(const QByteArray &winId)
constexpr bool earlierZoneData(const ZoneData &less, const ZoneData &more) noexcept
static QByteArray toWindowsIdLiteral(quint16 windowsIdKey)
QFuture< void > future
[5]