QTimeZone::OffsetData QTimeZone::previousTransition(const QDateTime &beforeDateTime) const { if (hasTransitions()) return d->toOffsetData(d->previousTransition(beforeDateTime.toMSecsSinceEpoch())); else return d->invalidOffsetData(); }
QTimeZone::OffsetData QTimeZone::nextTransition(const QDateTime &afterDateTime) const { if (hasTransitions()) return d->toOffsetData(d->nextTransition(afterDateTime.toMSecsSinceEpoch())); else return d->invalidOffsetData(); }
QTimeZone::OffsetData QTimeZone::offsetData(const QDateTime &forDateTime) const { if (hasTransitions()) return d->toOffsetData(d->data(forDateTime.toMSecsSinceEpoch())); else return d->invalidOffsetData(); }
QTimeZone::OffsetDataList QTimeZone::transitions(const QDateTime &fromDateTime, const QDateTime &toDateTime) const { OffsetDataList list; if (hasTransitions()) { const QTimeZonePrivate::DataList plist = d->transitions(fromDateTime.toMSecsSinceEpoch(), toDateTime.toMSecsSinceEpoch()); list.reserve(plist.count()); for (const QTimeZonePrivate::Data &pdata : plist) list.append(d->toOffsetData(pdata)); } return list; }
QDateTime KTimeZone::toZoneTime(const QDateTime &utcDateTime, bool *secondOccurrence) const { if (secondOccurrence) *secondOccurrence = false; if (!utcDateTime.isValid() || utcDateTime.timeSpec() != Qt::UTC) // check for invalid time return QDateTime(); // Convert UTC to local time if (hasTransitions()) { if (!data(true)) { // No data - default to UTC QDateTime dt = utcDateTime; dt.setTimeSpec(Qt::LocalTime); return dt; } const KTimeZoneData *data = d->d->data; const int index = data->transitionIndex(utcDateTime); const int secs = (index >= 0) ? data->transitions().at(index).phase().utcOffset() : data->previousUtcOffset(); QDateTime dt = utcDateTime.addSecs(secs); if (secondOccurrence) { // Check whether the local time occurs twice around a daylight savings time // shift, and if so, whether it's the first or second occurrence. *secondOccurrence = data->d->isSecondOccurrence(dt, index); } dt.setTimeSpec(Qt::LocalTime); return dt; } else { const int secs = offsetAtUtc(utcDateTime); QDateTime dt = utcDateTime.addSecs(secs); dt.setTimeSpec(Qt::LocalTime); if (secondOccurrence) { // Check whether the local time occurs twice around a daylight savings time // shift, and if so, whether it's the first or second occurrence. *secondOccurrence = (secs != offsetAtZoneTime(dt)); } return dt; } }
bool QWinTimeZonePrivate::hasDaylightTime() const { return hasTransitions(); }