From 2a653fde48f7312ccd2f792d72d305061b410ae3 Mon Sep 17 00:00:00 2001 From: Edward Welbourne Date: Thu, 28 Nov 2019 14:22:09 +0100 Subject: Convert date-time faithfully in QDateTimeEdit::setDateTime() Previously, setDateTime() was documented to ignore the new date-time's time-spec. It used the date and time (determined using that timespec) with the QDateTimeEdit's configured spec. It is debatable whether that really counts as ignoring its time-spec. All the same, that's what it did. Fixing it is a behavior change. Added tests. [ChangeLog][QtWidgets][QDateTimeEdit] QDateTimeEdit::setDateTime() now converts the new datetime to the QDateTimeEdit's time-spec, rather than combining its date and time (determined using the time spec it came with) with the QDateTimeEdit's date and time. Fixes: QTBUG-71181 Change-Id: Ibf0bd87723c3957ca00a2199d51d992032ef57ee Reviewed-by: Paul Wicking Reviewed-by: Volker Hilsheimer Reviewed-by: Konstantin Shegunov --- src/widgets/widgets/qdatetimeedit.cpp | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) (limited to 'src/widgets/widgets/qdatetimeedit.cpp') diff --git a/src/widgets/widgets/qdatetimeedit.cpp b/src/widgets/widgets/qdatetimeedit.cpp index 3d6716666d..33300b542a 100644 --- a/src/widgets/widgets/qdatetimeedit.cpp +++ b/src/widgets/widgets/qdatetimeedit.cpp @@ -53,6 +53,9 @@ #include #include #include +#if QT_CONFIG(timezone) +#include +#endif #include @@ -218,8 +221,8 @@ QDateTimeEdit::~QDateTimeEdit() \property QDateTimeEdit::dateTime \brief the QDateTime that is set in the QDateTimeEdit - When setting this property the timespec of the QDateTimeEdit remains the same - and the timespec of the new QDateTime is ignored. + When setting this property, the new QDateTime is converted to the timespec of + the QDateTimeEdit, which thus remains unchanged. By default, this property is set to the start of 2000 CE. It can only be set to a valid QDateTime value. If any operation causes this property to have an @@ -243,11 +246,14 @@ void QDateTimeEdit::setDateTime(const QDateTime &datetime) { Q_D(QDateTimeEdit); if (datetime.isValid()) { + QDateTime when = d->convertTimeSpec(datetime); + Q_ASSERT(when.timeSpec() == d->spec); + d->clearCache(); - const QDate date = datetime.date(); + const QDate date = when.date(); if (!(d->sections & DateSections_Mask)) setDateRange(date, date); - d->setValue(QDateTime(date, datetime.time(), d->spec), EmitIfChanged); + d->setValue(when, EmitIfChanged); } } @@ -1706,6 +1712,25 @@ QDateTimeEditPrivate::QDateTimeEditPrivate() #endif } +QDateTime QDateTimeEditPrivate::convertTimeSpec(const QDateTime &datetime) +{ + Q_ASSERT(value.toDateTime().timeSpec() == spec); + switch (spec) { + case Qt::UTC: + return datetime.toUTC(); + case Qt::LocalTime: + return datetime.toLocalTime(); + case Qt::OffsetFromUTC: + return datetime.toOffsetFromUtc(value.toDateTime().offsetFromUtc()); +#if QT_CONFIG(timezone) + case Qt::TimeZone: + return datetime.toTimeZone(value.toDateTime().timeZone()); +#endif + } + Q_UNREACHABLE(); +} + +// FIXME: architecturaly incompatible with OffsetFromUTC or TimeZone as spec (QTBUG-80417). void QDateTimeEditPrivate::updateTimeSpec() { minimum = minimum.toDateTime().toTimeSpec(spec); -- cgit v1.2.3