aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2023-01-12 10:03:14 +0100
committerUlf Hermann <ulf.hermann@qt.io>2023-06-06 20:20:09 +0200
commit3c1b8172611031833d4bcc479f651982b7586155 (patch)
tree99bf2993f65d2dab800545ee275fc3c64d52773c
parentc7f5507f0ee2c60c7ca16158868d00d6dc13a2b3 (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.cpp5
-rw-r--r--src/qml/jsruntime/qv4dateobject_p.h1
-rw-r--r--src/qml/jsruntime/qv4engine.cpp38
-rw-r--r--tests/auto/qml/qjsengine/tst_qjsengine.cpp21
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);
}
}