diff options
author | Ulf Hermann <ulf.hermann@qt.io> | 2023-01-12 10:03:14 +0100 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2023-06-06 20:20:09 +0200 |
commit | 3c1b8172611031833d4bcc479f651982b7586155 (patch) | |
tree | 99bf2993f65d2dab800545ee275fc3c64d52773c | |
parent | c7f5507f0ee2c60c7ca16158868d00d6dc13a2b3 (diff) |
V4: Unify type conversions for date and time values
We should always use the same conversion to string and we shouldn't
duplicate the code for the date conversion.
Task-number: QTBUG-109380
Change-Id: I1b1959c8e9b5957ddcf287d252b8143511237565
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Reviewed-by: Sami Shalayel <sami.shalayel@qt.io>
(cherry picked from commit 330c3e91eeed631e084b68454c3fbc248a1b4bb1)
-rw-r--r-- | src/qml/jsruntime/qv4dateobject.cpp | 5 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4dateobject_p.h | 1 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4engine.cpp | 38 | ||||
-rw-r--r-- | tests/auto/qml/qjsengine/tst_qjsengine.cpp | 21 |
4 files changed, 34 insertions, 31 deletions
diff --git a/src/qml/jsruntime/qv4dateobject.cpp b/src/qml/jsruntime/qv4dateobject.cpp index 196b9d9112..98d930eece 100644 --- a/src/qml/jsruntime/qv4dateobject.cpp +++ b/src/qml/jsruntime/qv4dateobject.cpp @@ -707,6 +707,11 @@ QDateTime DateObject::toQDateTime() const return d()->toQDateTime(); } +QString DateObject::toString() const +{ + return ToString(d()->date(), engine()->localTZA); +} + QString DateObject::dateTimeToString(const QDateTime &dateTime, ExecutionEngine *engine) { if (!dateTime.isValid()) diff --git a/src/qml/jsruntime/qv4dateobject_p.h b/src/qml/jsruntime/qv4dateobject_p.h index a9537afa7d..147638744d 100644 --- a/src/qml/jsruntime/qv4dateobject_p.h +++ b/src/qml/jsruntime/qv4dateobject_p.h @@ -203,6 +203,7 @@ struct DateObject: ReferenceObject { double date() const { return d()->date(); } Q_QML_PRIVATE_EXPORT QDateTime toQDateTime() const; + QString toString() const; static QString dateTimeToString(const QDateTime &dateTime, ExecutionEngine *engine); static QDate dateTimeToDate(const QDateTime &dateTime); diff --git a/src/qml/jsruntime/qv4engine.cpp b/src/qml/jsruntime/qv4engine.cpp index 271107b316..8de97a4aa4 100644 --- a/src/qml/jsruntime/qv4engine.cpp +++ b/src/qml/jsruntime/qv4engine.cpp @@ -1634,14 +1634,16 @@ static QVariant toVariant( return *ld->d()->locale; #endif if (const QV4::DateObject *d = value.as<DateObject>()) { - auto dt = d->toQDateTime(); - // See ExecutionEngine::metaTypeFromJS()'s handling of QMetaType::Date: - if (metaType == QMetaType::fromType<QDate>()) { - const auto utc = dt.toUTC(); - if (utc.date() != dt.date() && utc.addSecs(-1).date() == dt.date()) - dt = utc; - } - return dt; + if (metaType == QMetaType::fromType<QDate>()) + return DateObject::dateTimeToDate(d->toQDateTime()); + + if (metaType == QMetaType::fromType<QTime>()) + return d->toQDateTime().time(); + + if (metaType == QMetaType::fromType<QString>()) + return d->toString(); + + return d->toQDateTime(); } if (const QV4::UrlObject *d = value.as<UrlObject>()) return d->toQUrl(); @@ -2493,20 +2495,12 @@ bool ExecutionEngine::metaTypeFromJS(const Value &value, QMetaType metaType, voi } break; case QMetaType::QDate: if (const QV4::DateObject *d = value.as<DateObject>()) { - // If the Date object was parse()d from a string with no time part - // or zone specifier it's really the UTC start of the relevant day, - // but it's here represented as a local time, which may fall in the - // preceding day. See QTBUG-92466 for the gory details. - QDateTime dt = d->toQDateTime(); - const QDateTime utc = dt.toUTC(); - if (utc.date() != dt.date() && utc.addMSecs(-1).date() == dt.date()) - dt = utc; - // This may, of course, be The Wrong Thing if the date was - // constructed as a full local date-time that happens to coincide - // with the start of a UTC day; however, that would be an odd value - // to give to something that, apparently, someone thinks belongs in - // a QDate. - *reinterpret_cast<QDate *>(data) = dt.date(); + *reinterpret_cast<QDate *>(data) = DateObject::dateTimeToDate(d->toQDateTime()); + return true; + } break; + case QMetaType::QTime: + if (const QV4::DateObject *d = value.as<DateObject>()) { + *reinterpret_cast<QTime *>(data) = d->toQDateTime().time(); return true; } break; case QMetaType::QUrl: diff --git a/tests/auto/qml/qjsengine/tst_qjsengine.cpp b/tests/auto/qml/qjsengine/tst_qjsengine.cpp index 42117f5f49..3106a7a383 100644 --- a/tests/auto/qml/qjsengine/tst_qjsengine.cpp +++ b/tests/auto/qml/qjsengine/tst_qjsengine.cpp @@ -5984,15 +5984,16 @@ void tst_QJSEngine::coerceDateTime() DateTimeHolder *holder = qobject_cast<DateTimeHolder *>(o.data()); QVERIFY(holder); + const QJSValue jsDateTime = engine.toScriptValue(dateTime); holder->m_dateTime = dateTime; emit holder->dateTimeChanged(); - QEXPECT_FAIL("", "QML produces QDateTime::toString()", Continue); QCOMPARE((engine.coerceValue<QDateTime, QString>(dateTime)), holder->m_string); - + QCOMPARE(qjsvalue_cast<QString>(jsDateTime), holder->m_string); QCOMPARE((engine.coerceValue<QDateTime, QDate>(dateTime)), holder->m_date); - + QCOMPARE(qjsvalue_cast<QDate>(jsDateTime), holder->m_date); QCOMPARE((engine.coerceValue<QDateTime, QTime>(dateTime)), holder->m_time); + QCOMPARE(qjsvalue_cast<QTime>(jsDateTime), holder->m_time); } { @@ -6013,15 +6014,16 @@ void tst_QJSEngine::coerceDateTime() DateTimeHolder *holder = qobject_cast<DateTimeHolder *>(o.data()); QVERIFY(holder); + const QJSValue jsDate = engine.toScriptValue(date); holder->m_date = date; emit holder->dateChanged(); QCOMPARE((engine.coerceValue<QDate, QDateTime>(date)), holder->m_dateTime); - - QEXPECT_FAIL("", "QML produces QDateTime::toString()", Continue); + QCOMPARE(qjsvalue_cast<QDateTime>(jsDate), holder->m_dateTime); QCOMPARE((engine.coerceValue<QDate, QString>(date)), holder->m_string); - + QCOMPARE(qjsvalue_cast<QString>(jsDate), holder->m_string); QCOMPARE((engine.coerceValue<QDate, QTime>(date)), holder->m_time); + QCOMPARE(qjsvalue_cast<QTime>(jsDate), holder->m_time); } { @@ -6042,15 +6044,16 @@ void tst_QJSEngine::coerceDateTime() DateTimeHolder *holder = qobject_cast<DateTimeHolder *>(o.data()); QVERIFY(holder); + const QJSValue jsTime = engine.toScriptValue(time); holder->m_time = time; emit holder->timeChanged(); QCOMPARE((engine.coerceValue<QTime, QDateTime>(time)), holder->m_dateTime); - - QEXPECT_FAIL("", "QML produces QDateTime::toString()", Continue); + QCOMPARE(qjsvalue_cast<QDateTime>(jsTime), holder->m_dateTime); QCOMPARE((engine.coerceValue<QTime, QString>(time)), holder->m_string); - + QCOMPARE(qjsvalue_cast<QString>(jsTime), holder->m_string); QCOMPARE((engine.coerceValue<QTime, QDate>(time)), holder->m_date); + QCOMPARE(qjsvalue_cast<QDate>(jsTime), holder->m_date); } } |