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:
parent
f876562de8
commit
f06daaf3d8
|
@ -557,7 +557,13 @@ static inline QString ToString(double t)
|
||||||
{
|
{
|
||||||
if (std::isnan(t))
|
if (std::isnan(t))
|
||||||
return QStringLiteral("Invalid Date");
|
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);
|
double tzoffset = LocalTZA + DaylightSavingTA(t);
|
||||||
if (tzoffset) {
|
if (tzoffset) {
|
||||||
int hours = static_cast<int>(::fabs(tzoffset) / 1000 / 60 / 60);
|
int hours = static_cast<int>(::fabs(tzoffset) / 1000 / 60 / 60);
|
||||||
|
|
|
@ -0,0 +1,8 @@
|
||||||
|
import QtQuick 2.0
|
||||||
|
import Qt.test 1.0
|
||||||
|
|
||||||
|
Item {
|
||||||
|
function check_negative() {
|
||||||
|
return "result: " + new Date(-2000, 0, 1);
|
||||||
|
}
|
||||||
|
}
|
|
@ -200,6 +200,7 @@ private slots:
|
||||||
void sequenceSort();
|
void sequenceSort();
|
||||||
void dateParse();
|
void dateParse();
|
||||||
void utcDate();
|
void utcDate();
|
||||||
|
void negativeYear();
|
||||||
void qtbug_22464();
|
void qtbug_22464();
|
||||||
void qtbug_21580();
|
void qtbug_21580();
|
||||||
void singleV8BindingDestroyedDuringEvaluation();
|
void singleV8BindingDestroyedDuringEvaluation();
|
||||||
|
@ -7378,6 +7379,22 @@ void tst_qqmlecmascript::utcDate()
|
||||||
QVERIFY(q.toBool() == true);
|
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()
|
void tst_qqmlecmascript::concatenatedStringPropertyAccess()
|
||||||
{
|
{
|
||||||
QQmlComponent component(&engine, testFileUrl("concatenatedStringPropertyAccess.qml"));
|
QQmlComponent component(&engine, testFileUrl("concatenatedStringPropertyAccess.qml"));
|
||||||
|
|
Loading…
Reference in New Issue