8#include "private/qcore_mac_p.h"
11#include <Foundation/NSTimeZone.h>
26QMacTimeZonePrivate::QMacTimeZonePrivate()
29 [NSTimeZone resetSystemTimeZone];
30 m_nstz = [NSTimeZone.systemTimeZone retain];
32 m_id = QString::fromNSString(m_nstz.name).toUtf8();
36QMacTimeZonePrivate::QMacTimeZonePrivate(
const QByteArray &ianaId)
42QMacTimeZonePrivate::QMacTimeZonePrivate(
const QMacTimeZonePrivate &
other)
47QMacTimeZonePrivate::~QMacTimeZonePrivate()
52QMacTimeZonePrivate *QMacTimeZonePrivate::clone()
const
54 return new QMacTimeZonePrivate(*
this);
57void QMacTimeZonePrivate::init(
const QByteArray &ianaId)
59 if (availableTimeZoneIds().
contains(ianaId)) {
60 m_nstz = [[NSTimeZone timeZoneWithName:
QString::fromUtf8(ianaId).toNSString()] retain];
69 m_nstz = [NSTimeZone.systemTimeZone retain];
71 if (QString::fromNSString(m_nstz.name).toUtf8() == ianaId)
76QString QMacTimeZonePrivate::comment()
const
78 return QString::fromNSString(m_nstz.description);
81QString QMacTimeZonePrivate::displayName(QTimeZone::TimeType timeType,
82 QTimeZone::NameType nameType,
86 if (nameType == QTimeZone::OffsetName) {
89 if (timeType == QTimeZone::DaylightTime && hasDaylightTime())
90 return isoOffsetFormat(nowData.standardTimeOffset + 3600);
92 return isoOffsetFormat(nowData.standardTimeOffset);
95 NSTimeZoneNameStyle style = NSTimeZoneNameStyleStandard;
98 case QTimeZone::ShortName :
99 if (timeType == QTimeZone::DaylightTime)
100 style = NSTimeZoneNameStyleShortDaylightSaving;
101 else if (timeType == QTimeZone::GenericTime)
102 style = NSTimeZoneNameStyleShortGeneric;
104 style = NSTimeZoneNameStyleShortStandard;
106 case QTimeZone::DefaultName :
107 case QTimeZone::LongName :
108 if (timeType == QTimeZone::DaylightTime)
109 style = NSTimeZoneNameStyleDaylightSaving;
110 else if (timeType == QTimeZone::GenericTime)
111 style = NSTimeZoneNameStyleGeneric;
113 style = NSTimeZoneNameStyleStandard;
115 case QTimeZone::OffsetName :
120 NSString *macLocaleCode =
locale.name().toNSString();
121 NSLocale *macLocale = [[NSLocale alloc] initWithLocaleIdentifier:macLocaleCode];
122 const QString result = QString::fromNSString([m_nstz localizedName:style
locale:macLocale]);
127QString QMacTimeZonePrivate::abbreviation(
qint64 atMSecsSinceEpoch)
const
129 const NSTimeInterval seconds = atMSecsSinceEpoch / 1000.0;
130 return QString::fromNSString([m_nstz abbreviationForDate:[NSDate dateWithTimeIntervalSince1970:seconds]]);
133int QMacTimeZonePrivate::offsetFromUtc(
qint64 atMSecsSinceEpoch)
const
135 const NSTimeInterval seconds = atMSecsSinceEpoch / 1000.0;
136 return [m_nstz secondsFromGMTForDate:[NSDate dateWithTimeIntervalSince1970:seconds]];
139int QMacTimeZonePrivate::standardTimeOffset(
qint64 atMSecsSinceEpoch)
const
141 return offsetFromUtc(atMSecsSinceEpoch) - daylightTimeOffset(atMSecsSinceEpoch);
144int QMacTimeZonePrivate::daylightTimeOffset(
qint64 atMSecsSinceEpoch)
const
146 const NSTimeInterval seconds = atMSecsSinceEpoch / 1000.0;
147 return [m_nstz daylightSavingTimeOffsetForDate:[NSDate dateWithTimeIntervalSince1970:seconds]];
150bool QMacTimeZonePrivate::hasDaylightTime()
const
153 return hasTransitions();
156bool QMacTimeZonePrivate::isDaylightTime(
qint64 atMSecsSinceEpoch)
const
158 const NSTimeInterval seconds = atMSecsSinceEpoch / 1000.0;
159 return [m_nstz isDaylightSavingTimeForDate:[NSDate dateWithTimeIntervalSince1970:seconds]];
164 const NSTimeInterval seconds = forMSecsSinceEpoch / 1000.0;
165 NSDate *
date = [NSDate dateWithTimeIntervalSince1970:seconds];
167 data.atMSecsSinceEpoch = forMSecsSinceEpoch;
168 data.offsetFromUtc = [m_nstz secondsFromGMTForDate:
date];
169 data.daylightTimeOffset = [m_nstz daylightSavingTimeOffsetForDate:
date];
170 data.standardTimeOffset =
data.offsetFromUtc -
data.daylightTimeOffset;
171 data.abbreviation = QString::fromNSString([m_nstz abbreviationForDate:
date]);
175bool QMacTimeZonePrivate::hasTransitions()
const
179 NSDate *epoch = [NSDate dateWithTimeIntervalSince1970:0];
180 const NSDate *
date = [m_nstz nextDaylightSavingTimeTransitionAfterDate:epoch];
181 const bool result = (
date.timeIntervalSince1970 > epoch.timeIntervalSince1970);
188 const NSTimeInterval seconds = afterMSecsSinceEpoch / 1000.0;
189 NSDate *nextDate = [NSDate dateWithTimeIntervalSince1970:seconds];
190 nextDate = [m_nstz nextDaylightSavingTimeTransitionAfterDate:nextDate];
191 const NSTimeInterval nextSecs = nextDate.timeIntervalSince1970;
192 if (nextDate == nil || nextSecs <= seconds) {
197 tran.
offsetFromUtc = [m_nstz secondsFromGMTForDate:nextDate];
200 tran.
abbreviation = QString::fromNSString([m_nstz abbreviationForDate:nextDate]);
207 const NSTimeInterval lowerBound = std::numeric_limits<NSTimeInterval>::lowest();
208 const qint64 endSecs = beforeMSecsSinceEpoch / 1000;
209 const int year = 366 * 24 * 3600;
210 NSTimeInterval prevSecs = endSecs;
211 NSTimeInterval nextSecs = prevSecs - year;
212 NSTimeInterval tranSecs = lowerBound;
214 NSDate *nextDate = [NSDate dateWithTimeIntervalSince1970:nextSecs];
215 nextDate = [m_nstz nextDaylightSavingTimeTransitionAfterDate:nextDate];
217 && (tranSecs = nextDate.timeIntervalSince1970) < endSecs) {
222 nextDate = [NSDate dateWithTimeIntervalSince1970:lowerBound];
223 nextDate = [m_nstz nextDaylightSavingTimeTransitionAfterDate:nextDate];
224 if (nextDate != nil) {
225 NSTimeInterval lateSecs = nextSecs;
226 nextSecs = nextDate.timeIntervalSince1970;
227 Q_ASSERT(nextSecs <= endSecs - year || nextSecs == tranSecs);
247 while (nextSecs + year < lateSecs) {
249 NSTimeInterval middle = nextSecs / 2 + lateSecs / 2;
250 NSDate *
split = [NSDate dateWithTimeIntervalSince1970:middle];
251 split = [m_nstz nextDaylightSavingTimeTransitionAfterDate:
split];
252 if (
split != nil && (tranSecs =
split.timeIntervalSince1970) < endSecs) {
266 while (nextDate != nil && nextSecs < endSecs) {
268 nextDate = [m_nstz nextDaylightSavingTimeTransitionAfterDate:nextDate];
269 nextSecs = nextDate.timeIntervalSince1970;
270 if (nextSecs <= prevSecs)
273 if (prevSecs < endSecs)
280QByteArray QMacTimeZonePrivate::systemTimeZoneId()
const
283 [NSTimeZone resetSystemTimeZone];
284 Q_ASSERT(NSTimeZone.systemTimeZone);
285 return QString::fromNSString(NSTimeZone.systemTimeZone.name).toUtf8();
290 NSEnumerator *enumerator = NSTimeZone.knownTimeZoneNames.objectEnumerator;
291 QByteArray tzid = QString::fromNSString(enumerator.nextObject).toUtf8();
296 tzid = QString::fromNSString(enumerator.nextObject).toUtf8();
305NSTimeZone *QMacTimeZonePrivate::nsTimeZone()
const
bool isEmpty() const noexcept
Returns true if the byte array has size 0; otherwise returns false.
static qint64 currentMSecsSinceEpoch() noexcept
iterator erase(const_iterator begin, const_iterator end)
\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...
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.
static jboolean copy(JNIEnv *, jobject)
static const qint64 invalidData
static bool contains(const QJsonArray &haystack, unsigned needle)
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
static void split(QT_FT_Vector *b)
static QT_BEGIN_NAMESPACE void init(QTextBoundaryFinder::BoundaryType type, QStringView str, QCharAttributes *attributes)