QTimeZone - Fix Mac Transistions
Fix nextTransitions() where there are no next transitions and improve performance of previousTransition() and data(). Change-Id: I5d44525554243d139ba8d5f86e41bdfc0f7bfc25 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
This commit is contained in:
parent
5dc8ab409f
commit
9b7e6cb83d
@ -185,15 +185,14 @@ bool QMacTimeZonePrivate::isDaylightTime(qint64 atMSecsSinceEpoch) const
|
|||||||
QTimeZonePrivate::Data QMacTimeZonePrivate::data(qint64 forMSecsSinceEpoch) const
|
QTimeZonePrivate::Data QMacTimeZonePrivate::data(qint64 forMSecsSinceEpoch) const
|
||||||
{
|
{
|
||||||
const NSTimeInterval seconds = forMSecsSinceEpoch / 1000.0;
|
const NSTimeInterval seconds = forMSecsSinceEpoch / 1000.0;
|
||||||
|
NSDate *date = [NSDate dateWithTimeIntervalSince1970:seconds];
|
||||||
Data data;
|
Data data;
|
||||||
data.atMSecsSinceEpoch = forMSecsSinceEpoch;
|
data.atMSecsSinceEpoch = forMSecsSinceEpoch;
|
||||||
data.offsetFromUtc = [m_nstz secondsFromGMTForDate:
|
data.offsetFromUtc = [m_nstz secondsFromGMTForDate:date];
|
||||||
[NSDate dateWithTimeIntervalSince1970:seconds]];
|
data.daylightTimeOffset = [m_nstz daylightSavingTimeOffsetForDate:date];
|
||||||
data.daylightTimeOffset = [m_nstz daylightSavingTimeOffsetForDate:
|
|
||||||
[NSDate dateWithTimeIntervalSince1970:seconds]];
|
|
||||||
data.standardTimeOffset = data.offsetFromUtc - data.daylightTimeOffset;
|
data.standardTimeOffset = data.offsetFromUtc - data.daylightTimeOffset;
|
||||||
data.abbreviation = QCFString::toQString([m_nstz abbreviationForDate:
|
data.abbreviation = QCFString::toQString([m_nstz abbreviationForDate:date]);
|
||||||
[NSDate dateWithTimeIntervalSince1970:seconds]]);
|
[date release];
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -213,26 +212,46 @@ QTimeZonePrivate::Data QMacTimeZonePrivate::nextTransition(qint64 afterMSecsSinc
|
|||||||
{
|
{
|
||||||
QTimeZonePrivate::Data tran;
|
QTimeZonePrivate::Data tran;
|
||||||
const NSTimeInterval seconds = afterMSecsSinceEpoch / 1000.0;
|
const NSTimeInterval seconds = afterMSecsSinceEpoch / 1000.0;
|
||||||
NSDate *date = [NSDate dateWithTimeIntervalSince1970:seconds];
|
NSDate *nextDate = [NSDate dateWithTimeIntervalSince1970:seconds];
|
||||||
const NSDate *next = [m_nstz nextDaylightSavingTimeTransitionAfterDate:date];
|
nextDate = [m_nstz nextDaylightSavingTimeTransitionAfterDate:nextDate];
|
||||||
const NSTimeInterval nextSecs = [next timeIntervalSince1970];
|
const NSTimeInterval nextSecs = [nextDate timeIntervalSince1970];
|
||||||
|
if (nextDate == nil || nextSecs <= seconds) {
|
||||||
|
[nextDate release];
|
||||||
|
return invalidData();
|
||||||
|
}
|
||||||
tran.atMSecsSinceEpoch = nextSecs * 1000;
|
tran.atMSecsSinceEpoch = nextSecs * 1000;
|
||||||
tran.offsetFromUtc = [m_nstz secondsFromGMTForDate:
|
tran.offsetFromUtc = [m_nstz secondsFromGMTForDate:nextDate];
|
||||||
[NSDate dateWithTimeIntervalSince1970:nextSecs]];
|
tran.daylightTimeOffset = [m_nstz daylightSavingTimeOffsetForDate:nextDate];
|
||||||
tran.daylightTimeOffset = [m_nstz daylightSavingTimeOffsetForDate:
|
|
||||||
[NSDate dateWithTimeIntervalSince1970:nextSecs]];
|
|
||||||
tran.standardTimeOffset = tran.offsetFromUtc - tran.daylightTimeOffset;
|
tran.standardTimeOffset = tran.offsetFromUtc - tran.daylightTimeOffset;
|
||||||
tran.abbreviation = QCFString::toQString([m_nstz abbreviationForDate:date]);
|
tran.abbreviation = QCFString::toQString([m_nstz abbreviationForDate:nextDate]);
|
||||||
[next release];
|
[nextDate release];
|
||||||
[date release];
|
|
||||||
return tran;
|
return tran;
|
||||||
}
|
}
|
||||||
|
|
||||||
QTimeZonePrivate::Data QMacTimeZonePrivate::previousTransition(qint64 beforeMSecsSinceEpoch) const
|
QTimeZonePrivate::Data QMacTimeZonePrivate::previousTransition(qint64 beforeMSecsSinceEpoch) const
|
||||||
{
|
{
|
||||||
// TODO No direct Mac API, so get all transitions since epoch and return the last one
|
// No direct Mac API, so get all transitions since epoch and return the last one
|
||||||
// Probably slow, need to optimize
|
QList<int> secsList;
|
||||||
return transitions(0, beforeMSecsSinceEpoch - 1).last();
|
if (beforeMSecsSinceEpoch > 0) {
|
||||||
|
const int endSecs = beforeMSecsSinceEpoch / 1000.0;
|
||||||
|
NSTimeInterval prevSecs = 0;
|
||||||
|
NSTimeInterval nextSecs = 0;
|
||||||
|
NSDate *nextDate = [NSDate dateWithTimeIntervalSince1970:nextSecs];
|
||||||
|
// If invalid may return a nil date or an Epoch date
|
||||||
|
nextDate = [m_nstz nextDaylightSavingTimeTransitionAfterDate:nextDate];
|
||||||
|
nextSecs = [nextDate timeIntervalSince1970];
|
||||||
|
while (nextDate != nil && nextSecs > prevSecs && nextSecs < endSecs) {
|
||||||
|
secsList.append(nextSecs);
|
||||||
|
prevSecs = nextSecs;
|
||||||
|
nextDate = [m_nstz nextDaylightSavingTimeTransitionAfterDate:nextDate];
|
||||||
|
nextSecs = [nextDate timeIntervalSince1970];
|
||||||
|
}
|
||||||
|
[nextDate release];
|
||||||
|
}
|
||||||
|
if (secsList.size() >= 1)
|
||||||
|
return data(qint64(secsList.last()) * 1000);
|
||||||
|
else
|
||||||
|
return invalidData();
|
||||||
}
|
}
|
||||||
|
|
||||||
QByteArray QMacTimeZonePrivate::systemTimeZoneId() const
|
QByteArray QMacTimeZonePrivate::systemTimeZoneId() const
|
||||||
|
Loading…
x
Reference in New Issue
Block a user