diff options
Diffstat (limited to 'src/corelib/time/qdatetime.h')
-rw-r--r-- | src/corelib/time/qdatetime.h | 322 |
1 files changed, 216 insertions, 106 deletions
diff --git a/src/corelib/time/qdatetime.h b/src/corelib/time/qdatetime.h index 58dff850db..f8a9360fbb 100644 --- a/src/corelib/time/qdatetime.h +++ b/src/corelib/time/qdatetime.h @@ -5,10 +5,12 @@ #ifndef QDATETIME_H #define QDATETIME_H -#include <QtCore/qstring.h> +#include <QtCore/qcalendar.h> +#include <QtCore/qcompare.h> +#include <QtCore/qlocale.h> #include <QtCore/qnamespace.h> #include <QtCore/qshareddata.h> -#include <QtCore/qcalendar.h> +#include <QtCore/qstring.h> #include <limits> #include <chrono> @@ -20,9 +22,7 @@ Q_FORWARD_DECLARE_OBJC_CLASS(NSDate); QT_BEGIN_NAMESPACE -#if QT_CONFIG(timezone) class QTimeZone; -#endif class QDateTime; class Q_CORE_EXPORT QDate @@ -34,53 +34,36 @@ public: QDate(int y, int m, int d, QCalendar cal); #if __cpp_lib_chrono >= 201907L || defined(Q_QDOC) QT_POST_CXX17_API_IN_EXPORTED_CLASS - Q_IMPLICIT QDate(std::chrono::year_month_day ymd) - { - if (!ymd.ok()) - jd = nullJd(); - else - *this = fromStdSysDays(ymd); - } + Q_IMPLICIT constexpr QDate(std::chrono::year_month_day date) noexcept + : jd(date.ok() ? stdSysDaysToJulianDay(date) : nullJd()) + {} QT_POST_CXX17_API_IN_EXPORTED_CLASS - Q_IMPLICIT QDate(std::chrono::year_month_day_last ymdl) - { - if (!ymdl.ok()) - jd = nullJd(); - else - *this = fromStdSysDays(ymdl); - } + Q_IMPLICIT constexpr QDate(std::chrono::year_month_day_last date) noexcept + : jd(date.ok() ? stdSysDaysToJulianDay(date) : nullJd()) + {} QT_POST_CXX17_API_IN_EXPORTED_CLASS - Q_IMPLICIT QDate(std::chrono::year_month_weekday ymw) - { - if (!ymw.ok()) - jd = nullJd(); - else - *this = fromStdSysDays(ymw); - } + Q_IMPLICIT constexpr QDate(std::chrono::year_month_weekday date) noexcept + : jd(date.ok() ? stdSysDaysToJulianDay(date) : nullJd()) + {} QT_POST_CXX17_API_IN_EXPORTED_CLASS - Q_IMPLICIT QDate(std::chrono::year_month_weekday_last ymwl) - { - if (!ymwl.ok()) - jd = nullJd(); - else - *this = fromStdSysDays(ymwl); - } + Q_IMPLICIT constexpr QDate(std::chrono::year_month_weekday_last date) noexcept + : jd(date.ok() ? stdSysDaysToJulianDay(date) : nullJd()) + {} QT_POST_CXX17_API_IN_EXPORTED_CLASS - static QDate fromStdSysDays(const std::chrono::sys_days &days) + static constexpr QDate fromStdSysDays(const std::chrono::sys_days &days) noexcept { - const QDate epoch(unixEpochJd()); - return epoch.addDays(days.time_since_epoch().count()); + return QDate(stdSysDaysToJulianDay(days)); } QT_POST_CXX17_API_IN_EXPORTED_CLASS - std::chrono::sys_days toStdSysDays() const + constexpr std::chrono::sys_days toStdSysDays() const noexcept { - const QDate epoch(unixEpochJd()); - return std::chrono::sys_days(std::chrono::days(epoch.daysTo(*this))); + const qint64 days = isValid() ? jd - unixEpochJd() : 0; + return std::chrono::sys_days(std::chrono::days(days)); } #endif @@ -105,18 +88,25 @@ public: int daysInMonth(QCalendar cal) const; int daysInYear(QCalendar cal) const; - QDateTime startOfDay(Qt::TimeSpec spec = Qt::LocalTime, int offsetSeconds = 0) const; - QDateTime endOfDay(Qt::TimeSpec spec = Qt::LocalTime, int offsetSeconds = 0) const; -#if QT_CONFIG(timezone) +#if QT_DEPRECATED_SINCE(6, 9) + QT_DEPRECATED_VERSION_X_6_9("Pass QTimeZone instead") + QDateTime startOfDay(Qt::TimeSpec spec, int offsetSeconds = 0) const; + QT_DEPRECATED_VERSION_X_6_9("Pass QTimeZone instead") + QDateTime endOfDay(Qt::TimeSpec spec, int offsetSeconds = 0) const; +#endif + QDateTime startOfDay(const QTimeZone &zone) const; QDateTime endOfDay(const QTimeZone &zone) const; -#endif + QDateTime startOfDay() const; + QDateTime endOfDay() const; #if QT_CONFIG(datestring) QString toString(Qt::DateFormat format = Qt::TextDate) const; - QString toString(const QString &format, QCalendar cal = QCalendar()) const + QString toString(const QString &format) const; + QString toString(const QString &format, QCalendar cal) const { return toString(qToStringViewIgnoringNull(format), cal); } - QString toString(QStringView format, QCalendar cal = QCalendar()) const; + QString toString(QStringView format) const; + QString toString(QStringView format, QCalendar cal) const; #endif bool setDate(int year, int month, int day); // Gregorian-optimized bool setDate(int year, int month, int day, QCalendar cal); @@ -140,15 +130,37 @@ public: static QDate currentDate(); #if QT_CONFIG(datestring) + // No DateFormat accepts a two-digit year, so no need for baseYear: static QDate fromString(QStringView string, Qt::DateFormat format = Qt::TextDate); - static QDate fromString(QStringView string, QStringView format, QCalendar cal = QCalendar()) - { return fromString(string.toString(), format, cal); } - static QDate fromString(const QString &string, QStringView format, QCalendar cal = QCalendar()); static QDate fromString(const QString &string, Qt::DateFormat format = Qt::TextDate) { return fromString(qToStringViewIgnoringNull(string), format); } + + // Accept calendar without over-ride of base year: + static QDate fromString(QStringView string, QStringView format, QCalendar cal) + { return fromString(string.toString(), format, QLocale::DefaultTwoDigitBaseYear, cal); } + QT_CORE_INLINE_SINCE(6, 7) + static QDate fromString(const QString &string, QStringView format, QCalendar cal); + static QDate fromString(const QString &string, const QString &format, QCalendar cal) + { return fromString(string, qToStringViewIgnoringNull(format), QLocale::DefaultTwoDigitBaseYear, cal); } + + // Overriding base year is likely more common than overriding calendar (and + // likely to get more so, as the legacy base drops ever further behind us). + static QDate fromString(QStringView string, QStringView format, + int baseYear = QLocale::DefaultTwoDigitBaseYear) + { return fromString(string.toString(), format, baseYear); } + static QDate fromString(QStringView string, QStringView format, + int baseYear, QCalendar cal) + { return fromString(string.toString(), format, baseYear, cal); } + static QDate fromString(const QString &string, QStringView format, + int baseYear = QLocale::DefaultTwoDigitBaseYear); + static QDate fromString(const QString &string, QStringView format, + int baseYear, QCalendar cal); + static QDate fromString(const QString &string, const QString &format, + int baseYear = QLocale::DefaultTwoDigitBaseYear) + { return fromString(string, qToStringViewIgnoringNull(format), baseYear); } static QDate fromString(const QString &string, const QString &format, - QCalendar cal = QCalendar()) - { return fromString(string, qToStringViewIgnoringNull(format), cal); } + int baseYear, QCalendar cal) + { return fromString(string, qToStringViewIgnoringNull(format), baseYear, cal); } #endif static bool isValid(int y, int m, int d); static bool isLeapYear(int year); @@ -164,17 +176,34 @@ private: static constexpr inline qint64 maxJd() { return Q_INT64_C( 784354017364); } static constexpr inline qint64 unixEpochJd() { return Q_INT64_C(2440588); } +#if __cpp_lib_chrono >= 201907L + static constexpr qint64 stdSysDaysToJulianDay(const std::chrono::sys_days &days) noexcept + { + const auto epochDays = days.time_since_epoch().count(); + // minJd() and maxJd() fit into 40 bits. + if constexpr (sizeof(epochDays) * CHAR_BIT >= 41) { + constexpr auto top = maxJd() - unixEpochJd(); + constexpr auto bottom = minJd() - unixEpochJd(); + if (epochDays > top || epochDays < bottom) + return nullJd(); + } + return unixEpochJd() + epochDays; + } +#endif // __cpp_lib_chrono >= 201907L + qint64 jd; friend class QDateTime; + friend class QDateTimeParser; friend class QDateTimePrivate; - friend constexpr bool operator==(QDate lhs, QDate rhs) { return lhs.jd == rhs.jd; } - friend constexpr bool operator!=(QDate lhs, QDate rhs) { return lhs.jd != rhs.jd; } - friend constexpr bool operator< (QDate lhs, QDate rhs) { return lhs.jd < rhs.jd; } - friend constexpr bool operator<=(QDate lhs, QDate rhs) { return lhs.jd <= rhs.jd; } - friend constexpr bool operator> (QDate lhs, QDate rhs) { return lhs.jd > rhs.jd; } - friend constexpr bool operator>=(QDate lhs, QDate rhs) { return lhs.jd >= rhs.jd; } + friend constexpr bool comparesEqual(const QDate &lhs, const QDate &rhs) noexcept + { return lhs.jd == rhs.jd; } + friend constexpr Qt::strong_ordering + compareThreeWay(const QDate &lhs, const QDate &rhs) noexcept + { return Qt::compareThreeWay(lhs.jd, rhs.jd); } + Q_DECLARE_STRONGLY_ORDERED_LITERAL_TYPE(QDate) + #ifndef QT_NO_DATASTREAM friend Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, QDate); friend Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QDate &); @@ -232,12 +261,12 @@ private: constexpr inline int ds() const { return mds == -1 ? 0 : mds; } int mds; - friend constexpr bool operator==(QTime lhs, QTime rhs) { return lhs.mds == rhs.mds; } - friend constexpr bool operator!=(QTime lhs, QTime rhs) { return lhs.mds != rhs.mds; } - friend constexpr bool operator< (QTime lhs, QTime rhs) { return lhs.mds < rhs.mds; } - friend constexpr bool operator<=(QTime lhs, QTime rhs) { return lhs.mds <= rhs.mds; } - friend constexpr bool operator> (QTime lhs, QTime rhs) { return lhs.mds > rhs.mds; } - friend constexpr bool operator>=(QTime lhs, QTime rhs) { return lhs.mds >= rhs.mds; } + friend constexpr bool comparesEqual(const QTime &lhs, const QTime &rhs) noexcept + { return lhs.mds == rhs.mds; } + friend constexpr Qt::strong_ordering + compareThreeWay(const QTime &lhs, const QTime &rhs) noexcept + { return Qt::compareThreeWay(lhs.mds, rhs.mds); } + Q_DECLARE_STRONGLY_ORDERED_LITERAL_TYPE(QTime) friend class QDateTime; friend class QDateTimePrivate; @@ -253,31 +282,38 @@ class QDateTimePrivate; class Q_CORE_EXPORT QDateTime { struct ShortData { -#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN - quintptr status : 8; -#endif #if QT_VERSION >= QT_VERSION_CHECK(7,0,0) || defined(QT_BOOTSTRAPPED) +# if Q_BYTE_ORDER == Q_LITTLE_ENDIAN + qint64 status : 8; +# endif qint64 msecs : 56; + +# if Q_BYTE_ORDER == Q_BIG_ENDIAN + qint64 status : 8; +# endif #else +# if Q_BYTE_ORDER == Q_LITTLE_ENDIAN + quintptr status : 8; +# endif // note: this is only 24 bits on 32-bit systems... qintptr msecs : sizeof(void *) * 8 - 8; -#endif -#if Q_BYTE_ORDER == Q_BIG_ENDIAN +# if Q_BYTE_ORDER == Q_BIG_ENDIAN quintptr status : 8; +# endif #endif + friend constexpr bool operator==(const ShortData &lhs, const ShortData &rhs) + { return lhs.status == rhs.status && lhs.msecs == rhs.msecs; } }; union Data { - enum { - // To be of any use, we need at least 60 years around 1970, which - // is 1,893,456,000,000 ms. That requires 41 bits to store, plus - // the sign bit. With the status byte, the minimum size is 50 bits. - CanBeSmall = sizeof(ShortData) * 8 > 50 - }; + // To be of any use, we need at least 60 years around 1970, which + // is 1,893,456,000,000 ms. That requires 41 bits to store, plus + // the sign bit. With the status byte, the minimum size is 50 bits. + static constexpr bool CanBeSmall = sizeof(ShortData) * 8 > 50; Data() noexcept; - Data(Qt::TimeSpec); + Data(const QTimeZone &); Data(const Data &other) noexcept; Data(Data &&other) noexcept; Data &operator=(const Data &other) noexcept; @@ -288,7 +324,9 @@ class Q_CORE_EXPORT QDateTime { std::swap(data, other.data); } bool isShort() const; + inline void invalidate(); void detach(); + QTimeZone timeZone() const; const QDateTimePrivate *operator->() const; QDateTimePrivate *operator->(); @@ -299,10 +337,31 @@ class Q_CORE_EXPORT QDateTime public: QDateTime() noexcept; - QDateTime(QDate date, QTime time, Qt::TimeSpec spec = Qt::LocalTime, int offsetSeconds = 0); -#if QT_CONFIG(timezone) + + enum class TransitionResolution { + Reject = 0, + RelativeToBefore, + RelativeToAfter, + PreferBefore, + PreferAfter, + PreferStandard, + PreferDaylightSaving, + // Closest match to behavior prior to introducing TransitionResolution: + LegacyBehavior = RelativeToBefore + }; + +#if QT_DEPRECATED_SINCE(6, 9) + QT_DEPRECATED_VERSION_X_6_9("Pass QTimeZone instead") + QDateTime(QDate date, QTime time, Qt::TimeSpec spec, int offsetSeconds = 0); +#endif +#if QT_CORE_REMOVED_SINCE(6, 7) QDateTime(QDate date, QTime time, const QTimeZone &timeZone); -#endif // timezone + QDateTime(QDate date, QTime time); +#endif + QDateTime(QDate date, QTime time, const QTimeZone &timeZone, + TransitionResolution resolve = TransitionResolution::LegacyBehavior); + QDateTime(QDate date, QTime time, + TransitionResolution resolve = TransitionResolution::LegacyBehavior); QDateTime(const QDateTime &other) noexcept; QDateTime(QDateTime &&other) noexcept; ~QDateTime(); @@ -319,6 +378,7 @@ public: QTime time() const; Qt::TimeSpec timeSpec() const; int offsetFromUtc() const; + QTimeZone timeRepresentation() const; #if QT_CONFIG(timezone) QTimeZone timeZone() const; #endif // timezone @@ -328,21 +388,34 @@ public: qint64 toMSecsSinceEpoch() const; qint64 toSecsSinceEpoch() const; +#if QT_CORE_REMOVED_SINCE(6, 7) void setDate(QDate date); void setTime(QTime time); +#endif + void setDate(QDate date, TransitionResolution resolve = TransitionResolution::LegacyBehavior); + void setTime(QTime time, TransitionResolution resolve = TransitionResolution::LegacyBehavior); + +#if QT_DEPRECATED_SINCE(6, 9) + QT_DEPRECATED_VERSION_X_6_9("Use setTimeZone() instead") void setTimeSpec(Qt::TimeSpec spec); + QT_DEPRECATED_VERSION_X_6_9("Use setTimeZone() instead") void setOffsetFromUtc(int offsetSeconds); -#if QT_CONFIG(timezone) +#endif +#if QT_CORE_REMOVED_SINCE(6, 7) void setTimeZone(const QTimeZone &toZone); -#endif // timezone +#endif + void setTimeZone(const QTimeZone &toZone, + TransitionResolution resolve = TransitionResolution::LegacyBehavior); void setMSecsSinceEpoch(qint64 msecs); void setSecsSinceEpoch(qint64 secs); #if QT_CONFIG(datestring) QString toString(Qt::DateFormat format = Qt::TextDate) const; - QString toString(const QString &format, QCalendar cal = QCalendar()) const + QString toString(const QString &format) const; + QString toString(const QString &format, QCalendar cal) const { return toString(qToStringViewIgnoringNull(format), cal); } - QString toString(QStringView format, QCalendar cal = QCalendar()) const; + QString toString(QStringView format) const; + QString toString(QStringView format, QCalendar cal) const; #endif [[nodiscard]] QDateTime addDays(qint64 days) const; [[nodiscard]] QDateTime addMonths(int months) const; @@ -354,43 +427,67 @@ public: return addMSecs(msecs.count()); } +#if QT_DEPRECATED_SINCE(6, 9) + QT_DEPRECATED_VERSION_X_6_9("Use toTimeZone instead") QDateTime toTimeSpec(Qt::TimeSpec spec) const; - inline QDateTime toLocalTime() const { return toTimeSpec(Qt::LocalTime); } - inline QDateTime toUTC() const { return toTimeSpec(Qt::UTC); } +#endif + QDateTime toLocalTime() const; + QDateTime toUTC() const; QDateTime toOffsetFromUtc(int offsetSeconds) const; -#if QT_CONFIG(timezone) QDateTime toTimeZone(const QTimeZone &toZone) const; -#endif // timezone qint64 daysTo(const QDateTime &) const; qint64 secsTo(const QDateTime &) const; qint64 msecsTo(const QDateTime &) const; + static QDateTime currentDateTime(const QTimeZone &zone); static QDateTime currentDateTime(); static QDateTime currentDateTimeUtc(); #if QT_CONFIG(datestring) + // No DateFormat accepts a two-digit year, so no need for baseYear: static QDateTime fromString(QStringView string, Qt::DateFormat format = Qt::TextDate); - static QDateTime fromString(QStringView string, QStringView format, - QCalendar cal = QCalendar()) - { return fromString(string.toString(), format, cal); } - static QDateTime fromString(const QString &string, QStringView format, - QCalendar cal = QCalendar()); static QDateTime fromString(const QString &string, Qt::DateFormat format = Qt::TextDate) { return fromString(qToStringViewIgnoringNull(string), format); } + + // Accept calendar without over-ride of base year: + static QDateTime fromString(QStringView string, QStringView format, QCalendar cal) + { return fromString(string.toString(), format, QLocale::DefaultTwoDigitBaseYear, cal); } + QT_CORE_INLINE_SINCE(6, 7) + static QDateTime fromString(const QString &string, QStringView format, QCalendar cal); + static QDateTime fromString(const QString &string, const QString &format, QCalendar cal) + { return fromString(string, qToStringViewIgnoringNull(format), QLocale::DefaultTwoDigitBaseYear, cal); } + + // Overriding base year is likely more common than overriding calendar (and + // likely to get more so, as the legacy base drops ever further behind us). + static QDateTime fromString(QStringView string, QStringView format, + int baseYear = QLocale::DefaultTwoDigitBaseYear) + { return fromString(string.toString(), format, baseYear); } + static QDateTime fromString(QStringView string, QStringView format, + int baseYear, QCalendar cal) + { return fromString(string.toString(), format, baseYear, cal); } + static QDateTime fromString(const QString &string, QStringView format, + int baseYear = QLocale::DefaultTwoDigitBaseYear); + static QDateTime fromString(const QString &string, QStringView format, + int baseYear, QCalendar cal); + static QDateTime fromString(const QString &string, const QString &format, + int baseYear = QLocale::DefaultTwoDigitBaseYear) + { return fromString(string, qToStringViewIgnoringNull(format), baseYear); } static QDateTime fromString(const QString &string, const QString &format, - QCalendar cal = QCalendar()) - { return fromString(string, qToStringViewIgnoringNull(format), cal); } + int baseYear, QCalendar cal) + { return fromString(string, qToStringViewIgnoringNull(format), baseYear, cal); } #endif - static QDateTime fromMSecsSinceEpoch(qint64 msecs, Qt::TimeSpec spec = Qt::LocalTime, - int offsetFromUtc = 0); - static QDateTime fromSecsSinceEpoch(qint64 secs, Qt::TimeSpec spec = Qt::LocalTime, - int offsetFromUtc = 0); +#if QT_DEPRECATED_SINCE(6, 9) + QT_DEPRECATED_VERSION_X_6_9("Pass QTimeZone instead of time-spec, offset") + static QDateTime fromMSecsSinceEpoch(qint64 msecs, Qt::TimeSpec spec, int offsetFromUtc = 0); + QT_DEPRECATED_VERSION_X_6_9("Pass QTimeZone instead of time-spec, offset") + static QDateTime fromSecsSinceEpoch(qint64 secs, Qt::TimeSpec spec, int offsetFromUtc = 0); +#endif -#if QT_CONFIG(timezone) static QDateTime fromMSecsSinceEpoch(qint64 msecs, const QTimeZone &timeZone); static QDateTime fromSecsSinceEpoch(qint64 secs, const QTimeZone &timeZone); -#endif + static QDateTime fromMSecsSinceEpoch(qint64 msecs); + static QDateTime fromSecsSinceEpoch(qint64 secs); static qint64 currentMSecsSinceEpoch() noexcept; static qint64 currentSecsSinceEpoch() noexcept; @@ -432,11 +529,11 @@ public: QT_POST_CXX17_API_IN_EXPORTED_CLASS static QDateTime fromStdLocalTime(const std::chrono::local_time<std::chrono::milliseconds> &time) { - QDateTime result(QDate(1970, 1, 1), QTime(0, 0, 0), Qt::LocalTime); + QDateTime result(QDate(1970, 1, 1), QTime(0, 0, 0)); return result.addMSecs(time.time_since_epoch().count()); } -#if QT_CONFIG(timezone) +#if QT_CONFIG(timezone) && (__cpp_lib_chrono >= 201907L || defined(Q_QDOC)) // zoned_time. defined in qtimezone.h QT_POST_CXX17_API_IN_EXPORTED_CLASS static QDateTime fromStdZonedTime(const std::chrono::zoned_time< @@ -449,7 +546,7 @@ public: std::chrono::sys_time<std::chrono::milliseconds> toStdSysMilliseconds() const { const std::chrono::milliseconds duration(toMSecsSinceEpoch()); - return std::chrono::sys_time(duration); + return std::chrono::sys_time<std::chrono::milliseconds>(duration); } QT_POST_CXX17_API_IN_EXPORTED_CLASS @@ -498,17 +595,18 @@ public: private: bool equals(const QDateTime &other) const; +#if QT_CORE_REMOVED_SINCE(6, 7) bool precedes(const QDateTime &other) const; +#endif friend class QDateTimePrivate; Data d; - friend bool operator==(const QDateTime &lhs, const QDateTime &rhs) { return lhs.equals(rhs); } - friend bool operator!=(const QDateTime &lhs, const QDateTime &rhs) { return !(lhs == rhs); } - friend bool operator<(const QDateTime &lhs, const QDateTime &rhs) { return lhs.precedes(rhs); } - friend bool operator<=(const QDateTime &lhs, const QDateTime &rhs) { return !(rhs < lhs); } - friend bool operator>(const QDateTime &lhs, const QDateTime &rhs) { return rhs.precedes(lhs); } - friend bool operator>=(const QDateTime &lhs, const QDateTime &rhs) { return !(lhs < rhs); } + friend bool comparesEqual(const QDateTime &lhs, const QDateTime &rhs) + { return lhs.equals(rhs); } + friend Q_CORE_EXPORT Qt::weak_ordering + compareThreeWay(const QDateTime &lhs, const QDateTime &rhs); + Q_DECLARE_WEAKLY_ORDERED(QDateTime) #ifndef QT_NO_DATASTREAM friend Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, const QDateTime &); @@ -542,6 +640,18 @@ Q_CORE_EXPORT size_t qHash(const QDateTime &key, size_t seed = 0); Q_CORE_EXPORT size_t qHash(QDate key, size_t seed = 0) noexcept; Q_CORE_EXPORT size_t qHash(QTime key, size_t seed = 0) noexcept; +#if QT_CONFIG(datestring) && QT_CORE_INLINE_IMPL_SINCE(6, 7) +QDate QDate::fromString(const QString &string, QStringView format, QCalendar cal) +{ + return fromString(string, format, QLocale::DefaultTwoDigitBaseYear, cal); +} + +QDateTime QDateTime::fromString(const QString &string, QStringView format, QCalendar cal) +{ + return fromString(string, format, QLocale::DefaultTwoDigitBaseYear, cal); +} +#endif + QT_END_NAMESPACE #endif // QDATETIME_H |