Properly handle negative years when printing JS Dates to strings.

JavaScript knows a year 0. That is correctly translated into QDateTime
terms when creating a Date object, but it's not correctly translated
back when converting the JavaScript date to a string.

Task-number: QTBUG-29491
Change-Id: I46b200a144434187656d08e87f422f97523acd0e
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
This commit is contained in:
Ulf Hermann 2014-10-24 15:06:22 +02:00
parent f876562de8
commit f06daaf3d8
3 changed files with 32 additions and 1 deletions

View File

@ -557,7 +557,13 @@ static inline QString ToString(double t)
{
if (std::isnan(t))
return QStringLiteral("Invalid Date");
QString str = ToDateTime(t, Qt::LocalTime).toString() + QStringLiteral(" GMT");
QDateTime dateTime = ToDateTime(t, Qt::LocalTime);
// JavaScript knows a year 0, while QDateTime doesn't. So, in order to show the right date we
// have to add a year to negative ones here.
if (dateTime.date().year() < 0)
dateTime = dateTime.addYears(1);
QString str = dateTime.toString() + QStringLiteral(" GMT");
double tzoffset = LocalTZA + DaylightSavingTA(t);
if (tzoffset) {
int hours = static_cast<int>(::fabs(tzoffset) / 1000 / 60 / 60);

View File

@ -0,0 +1,8 @@
import QtQuick 2.0
import Qt.test 1.0
Item {
function check_negative() {
return "result: " + new Date(-2000, 0, 1);
}
}

View File

@ -200,6 +200,7 @@ private slots:
void sequenceSort();
void dateParse();
void utcDate();
void negativeYear();
void qtbug_22464();
void qtbug_21580();
void singleV8BindingDestroyedDuringEvaluation();
@ -7378,6 +7379,22 @@ void tst_qqmlecmascript::utcDate()
QVERIFY(q.toBool() == true);
}
void tst_qqmlecmascript::negativeYear()
{
QQmlComponent component(&engine, testFileUrl("negativeyear.qml"));
QObject *object = component.create();
if (object == 0)
qDebug() << component.errorString();
QVERIFY(object != 0);
QVariant q;
QMetaObject::invokeMethod(object, "check_negative",
Q_RETURN_ARG(QVariant, q));
// Strip the timezone. It should be irrelevant as the date was created with the same one.
QCOMPARE(q.toString().left(32), QStringLiteral("result: Mon Jan 1 00:00:00 -2000"));
}
void tst_qqmlecmascript::concatenatedStringPropertyAccess()
{
QQmlComponent component(&engine, testFileUrl("concatenatedStringPropertyAccess.qml"));