diff options
Diffstat (limited to 'src/corelib/time/qdatetime_p.h')
-rw-r--r-- | src/corelib/time/qdatetime_p.h | 48 |
1 files changed, 34 insertions, 14 deletions
diff --git a/src/corelib/time/qdatetime_p.h b/src/corelib/time/qdatetime_p.h index 0636a3a223..02b047dd73 100644 --- a/src/corelib/time/qdatetime_p.h +++ b/src/corelib/time/qdatetime_p.h @@ -21,11 +21,14 @@ #include "QtCore/qatomic.h" #include "QtCore/qdatetime.h" #include "QtCore/qshareddata.h" +#include "QtCore/qtimezone.h" #if QT_CONFIG(timezone) #include "qtimezone.h" #endif +#include <chrono> + QT_BEGIN_NAMESPACE class QDateTimePrivate : public QSharedData @@ -60,7 +63,6 @@ public: ValidDate = 0x02, ValidTime = 0x04, ValidDateTime = 0x08, - ValidWhenMask = ValidDate | ValidTime | ValidDateTime, TimeSpecMask = 0x30, @@ -71,6 +73,22 @@ public: }; Q_DECLARE_FLAGS(StatusFlags, StatusFlag) + + enum TransitionOption { + // Handling of a spring-forward (or other gap): + GapUseBefore = 2, + GapUseAfter = 4, + // Handling of a fall-back (or other repeated period): + FoldUseBefore = 0x20, + FoldUseAfter = 0x40, + // Quirk for negative DST: + FlipForReverseDst = 0x400, + + GapMask = GapUseBefore | GapUseAfter, + FoldMask = FoldUseBefore | FoldUseAfter, + }; + Q_DECLARE_FLAGS(TransitionOptions, TransitionOption) + enum { TimeSpecShift = 4, }; @@ -87,43 +105,45 @@ public: : when(w), offset(o), dst(d), valid(v) {} }; - static QDateTime::Data create(QDate toDate, QTime toTime, Qt::TimeSpec toSpec, - int offsetSeconds); - + static QDateTime::Data create(QDate toDate, QTime toTime, const QTimeZone &timeZone, + QDateTime::TransitionResolution resolve); #if QT_CONFIG(timezone) - static QDateTime::Data create(QDate toDate, QTime toTime, const QTimeZone & timeZone); - - static ZoneState zoneStateAtMillis(const QTimeZone &zone, qint64 millis, DaylightStatus dst); + static ZoneState zoneStateAtMillis(const QTimeZone &zone, qint64 millis, + TransitionOptions resolve); #endif // timezone static ZoneState expressUtcAsLocal(qint64 utcMSecs); - static ZoneState localStateAtMillis(qint64 millis, DaylightStatus dst); + static ZoneState localStateAtMillis(qint64 millis, TransitionOptions resolve); static QString localNameAtMillis(qint64 millis, DaylightStatus dst); // empty if unknown StatusFlags m_status = StatusFlag(Qt::LocalTime << TimeSpecShift); qint64 m_msecs = 0; int m_offsetFromUtc = 0; -#if QT_CONFIG(timezone) QTimeZone m_timeZone; -#endif // timezone }; Q_DECLARE_OPERATORS_FOR_FLAGS(QDateTimePrivate::StatusFlags) +Q_DECLARE_OPERATORS_FOR_FLAGS(QDateTimePrivate::TransitionOptions) namespace QtPrivate { namespace DateTimeConstants { +using namespace std::chrono; +constexpr qint64 SECS_PER_MIN = minutes::period::num; +constexpr qint64 SECS_PER_HOUR = hours::period::num; +constexpr qint64 SECS_PER_DAY = SECS_PER_HOUR * 24; // std::chrono::days is C++20 -constexpr qint64 SECS_PER_MIN = 60; -constexpr qint64 SECS_PER_HOUR = SECS_PER_MIN * 60; -constexpr qint64 SECS_PER_DAY = SECS_PER_HOUR * 24; +constexpr qint64 MINS_PER_HOUR = std::ratio_divide<hours::period, minutes::period>::num; -constexpr qint64 MSECS_PER_SEC = 1000; +constexpr qint64 MSECS_PER_SEC = milliseconds::period::den; constexpr qint64 MSECS_PER_MIN = SECS_PER_MIN * MSECS_PER_SEC; constexpr qint64 MSECS_PER_HOUR = SECS_PER_HOUR * MSECS_PER_SEC; constexpr qint64 MSECS_PER_DAY = SECS_PER_DAY * MSECS_PER_SEC; constexpr qint64 JULIAN_DAY_FOR_EPOCH = 2440588; // result of QDate(1970, 1, 1).toJulianDay() + +constexpr qint64 JulianDayMax = Q_INT64_C( 784354017364); +constexpr qint64 JulianDayMin = Q_INT64_C(-784350574879); } } |