8#include <unicode/ucal.h>
26static UCalendarDisplayNameType
ucalDisplayNameType(QTimeZone::TimeType timeType, QTimeZone::NameType nameType)
30 case QTimeZone::ShortName :
31 case QTimeZone::OffsetName :
32 if (timeType == QTimeZone::DaylightTime)
33 return UCAL_SHORT_DST;
35 return UCAL_SHORT_STANDARD;
36 case QTimeZone::DefaultName :
37 case QTimeZone::LongName :
38 if (timeType == QTimeZone::DaylightTime)
51 UErrorCode status = U_ZERO_ERROR;
54 size = ucal_getDefaultTimeZone(
reinterpret_cast<UChar *
>(
result.data()),
size, &status);
57 if (status == U_BUFFER_OVERFLOW_ERROR) {
59 status = U_ZERO_ERROR;
60 size = ucal_getDefaultTimeZone(
reinterpret_cast<UChar *
>(
result.data()),
size, &status);
64 if (U_SUCCESS(status)) {
66 return std::move(
result).toUtf8();
74 QTimeZone::NameType nameType,
79 UErrorCode status = U_ZERO_ERROR;
82 size = ucal_getTimeZoneDisplayName(ucal,
85 reinterpret_cast<UChar *
>(
result.data()),
90 if (status == U_BUFFER_OVERFLOW_ERROR) {
92 status = U_ZERO_ERROR;
93 size = ucal_getTimeZoneDisplayName(ucal,
96 reinterpret_cast<UChar *
>(
result.data()),
102 if (U_SUCCESS(status)) {
112 int *utcOffset,
int *dstOffset)
118 UErrorCode status = U_ZERO_ERROR;
119 UCalendar *ucal = ucal_clone(m_ucal, &status);
120 if (!U_SUCCESS(status))
124 status = U_ZERO_ERROR;
125 ucal_setMillis(ucal, atMSecsSinceEpoch, &status);
128 if (U_SUCCESS(status)) {
129 status = U_ZERO_ERROR;
131 utc = ucal_get(ucal, UCAL_ZONE_OFFSET, &status) / 1000;
135 if (U_SUCCESS(status)) {
136 status = U_ZERO_ERROR;
138 dst = ucal_get(ucal, UCAL_DST_OFFSET, &status) / 1000;
142 if (U_SUCCESS(status)) {
150#if U_ICU_VERSION_MAJOR_NUM >= 50
153 UTimeZoneTransitionType
type,
159 UErrorCode status = U_ZERO_ERROR;
160 UCalendar *ucal = ucal_clone(m_ucal, &status);
161 if (!U_SUCCESS(status))
165 status = U_ZERO_ERROR;
166 ucal_setMillis(ucal, atMSecsSinceEpoch, &status);
170 status = U_ZERO_ERROR;
171 bool ok = ucal_getTimeZoneTransitionDate(ucal,
type, &tranMSecs, &status);
174 if (U_SUCCESS(status) &&
ok &&
type == UCAL_TZ_TRANSITION_NEXT) {
178 ok =
qint64(tranMSecs) > atMSecsSinceEpoch;
182 if (U_SUCCESS(status) &&
ok) {
183 status = U_ZERO_ERROR;
184 ucal_setMillis(ucal, tranMSecs, &status);
188 if (U_SUCCESS(status) &&
ok) {
189 status = U_ZERO_ERROR;
190 utc = ucal_get(ucal, UCAL_ZONE_OFFSET, &status) / 1000;
194 if (U_SUCCESS(status) &&
ok) {
195 status = U_ZERO_ERROR;
196 dst = ucal_get(ucal, UCAL_DST_OFFSET, &status) / 1000;
200 if (!U_SUCCESS(status) || !
ok)
222 UErrorCode status = U_ZERO_ERROR;
225 while (U_SUCCESS(status) && !
result.isEmpty()) {
227 status = U_ZERO_ERROR;
238 UErrorCode status = U_ZERO_ERROR;
240 const int32_t dstMSecs = ucal_getDSTSavings(
241 reinterpret_cast<const UChar *
>(utf16.
data()), &status);
242 return U_SUCCESS(status) ? dstMSecs / 1000 : 0;
246QIcuTimeZonePrivate::QIcuTimeZonePrivate()
254QIcuTimeZonePrivate::QIcuTimeZonePrivate(
const QByteArray &ianaId)
258 if (availableTimeZoneIds().
contains(ianaId))
262QIcuTimeZonePrivate::QIcuTimeZonePrivate(
const QIcuTimeZonePrivate &
other)
266 UErrorCode status = U_ZERO_ERROR;
267 m_ucal = ucal_clone(
other.m_ucal, &status);
268 if (!U_SUCCESS(status)) {
274QIcuTimeZonePrivate::~QIcuTimeZonePrivate()
279QIcuTimeZonePrivate *QIcuTimeZonePrivate::clone()
const
281 return new QIcuTimeZonePrivate(*
this);
284void QIcuTimeZonePrivate::init(
const QByteArray &ianaId)
289 UErrorCode status = U_ZERO_ERROR;
291 m_ucal = ucal_open(
reinterpret_cast<const UChar *
>(
id.
data()),
id.
size(),
294 if (!U_SUCCESS(status)) {
300QString QIcuTimeZonePrivate::displayName(QTimeZone::TimeType timeType,
301 QTimeZone::NameType nameType,
305 if (nameType == QTimeZone::OffsetName) {
309 if (timeType == QTimeZone::DaylightTime)
312 return isoOffsetFormat(nowData.standardTimeOffset);
317QString QIcuTimeZonePrivate::abbreviation(
qint64 atMSecsSinceEpoch)
const
320 if (isDaylightTime(atMSecsSinceEpoch))
326int QIcuTimeZonePrivate::offsetFromUtc(
qint64 atMSecsSinceEpoch)
const
331 return stdOffset + dstOffset;
334int QIcuTimeZonePrivate::standardTimeOffset(
qint64 atMSecsSinceEpoch)
const
342int QIcuTimeZonePrivate::daylightTimeOffset(
qint64 atMSecsSinceEpoch)
const
350bool QIcuTimeZonePrivate::hasDaylightTime()
const
354#if U_ICU_VERSION_MAJOR_NUM >= 50
355 for (
qint64 when = minMSecs(); when != invalidMSecs(); ) {
356 auto data = nextTransition(when);
357 if (
data.daylightTimeOffset &&
data.daylightTimeOffset != invalidSeconds())
359 when =
data.atMSecsSinceEpoch;
365bool QIcuTimeZonePrivate::isDaylightTime(
qint64 atMSecsSinceEpoch)
const
368 UErrorCode status = U_ZERO_ERROR;
369 UCalendar *ucal = ucal_clone(m_ucal, &status);
370 if (!U_SUCCESS(status))
374 status = U_ZERO_ERROR;
375 ucal_setMillis(ucal, atMSecsSinceEpoch, &status);
378 if (U_SUCCESS(status)) {
379 status = U_ZERO_ERROR;
380 result = ucal_inDaylightTime(ucal, &status);
391#if U_ICU_VERSION_MAJOR_NUM >= 50
392 data = ucalTimeZoneTransition(m_ucal, UCAL_TZ_TRANSITION_PREVIOUS_INCLUSIVE,
394 if (
data.atMSecsSinceEpoch == invalidMSecs())
398 &
data.daylightTimeOffset);
399 data.offsetFromUtc =
data.standardTimeOffset +
data.daylightTimeOffset;
400 data.abbreviation = abbreviation(forMSecsSinceEpoch);
402 data.atMSecsSinceEpoch = forMSecsSinceEpoch;
406bool QIcuTimeZonePrivate::hasTransitions()
const
409#if U_ICU_VERSION_MAJOR_NUM >= 50
419#if U_ICU_VERSION_MAJOR_NUM >= 50
420 return ucalTimeZoneTransition(m_ucal, UCAL_TZ_TRANSITION_NEXT, afterMSecsSinceEpoch);
430#if U_ICU_VERSION_MAJOR_NUM >= 50
431 return ucalTimeZoneTransition(m_ucal, UCAL_TZ_TRANSITION_PREVIOUS, beforeMSecsSinceEpoch);
438QByteArray QIcuTimeZonePrivate::systemTimeZoneId()
const
447 UErrorCode status = U_ZERO_ERROR;
448 UEnumeration *uenum = ucal_openTimeZones(&status);
450 if (U_SUCCESS(status))
460 UErrorCode status = U_ZERO_ERROR;
461 UEnumeration *uenum = ucal_openCountryTimeZones(regionCodeUtf8.
data(), &status);
463 if (U_SUCCESS(status))
469QList<QByteArray> QIcuTimeZonePrivate::availableTimeZoneIds(
int offsetFromUtc)
const
472#if U_ICU_VERSION_MAJOR_NUM >= 49 || (U_ICU_VERSION_MAJOR_NUM == 4 && U_ICU_VERSION_MINOR_NUM == 8)
473 UErrorCode status = U_ZERO_ERROR;
474 UEnumeration *uenum = ucal_openTimeZoneIDEnumeration(UCAL_ZONE_TYPE_ANY,
nullptr,
475 &offsetFromUtc, &status);
477 if (U_SUCCESS(status))
char * data()
\macro QT_NO_CAST_FROM_BYTEARRAY
static qint64 currentMSecsSinceEpoch() noexcept
iterator erase(const_iterator begin, const_iterator end)
static QLatin1StringView territoryToCode(QLocale::Territory territory)
\macro QT_RESTRICTED_CAST_FROM_ASCII
static QString fromLatin1(QByteArrayView ba)
This is an overloaded member function, provided for convenience. It differs from the above function o...
static QString fromUtf8(QByteArrayView utf8)
This is an overloaded member function, provided for convenience. It differs from the above function o...
QChar * data()
Returns a pointer to the data stored in the QString.
QByteArray toUtf8() const &
static Data invalidData()
virtual QList< QByteArray > availableTimeZoneIds() const
Q_QML_PRIVATE_EXPORT QV4::ReturnedValue locale(QV4::ExecutionEngine *engine, const QString &localeName)
Provides locale specific properties and formatted data.
Combined button and popup list for selecting options.
int toUtf8(char16_t u, OutputPtr &dst, InputPtr &src, InputPtr end)
constexpr Initialization Uninitialized
static QString displayName(CGDirectDisplayID displayID)
static const qint64 invalidData
static bool contains(const QJsonArray &haystack, unsigned needle)
GLenum GLuint GLintptr GLsizeiptr size
[1]
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
static QT_BEGIN_NAMESPACE void init(QTextBoundaryFinder::BoundaryType type, QStringView str, QCharAttributes *attributes)
static bool ucalOffsetsAtTime(UCalendar *m_ucal, qint64 atMSecsSinceEpoch, int *utcOffset, int *dstOffset)
static QString ucalTimeZoneDisplayName(UCalendar *ucal, QTimeZone::TimeType timeType, QTimeZone::NameType nameType, const QString &localeCode)
static QByteArray ucalDefaultTimeZoneId()
static QT_BEGIN_NAMESPACE UCalendarDisplayNameType ucalDisplayNameType(QTimeZone::TimeType timeType, QTimeZone::NameType nameType)
static int ucalDaylightOffset(const QByteArray &id)
static QList< QByteArray > uenumToIdList(UEnumeration *uenum)