QLocale: fix handling of milliseconds in string format and document
[ChangeLog][QtCore][QLocale] Fixed the conversion of QTime to string form and parsing from string form to always treat the value as the decimal fraction of the seconds component. That is, the string format ".z" produces/parses ".2" for 200 milliseconds and ".002" for 2 milliseconds. Use of "z" or "zzz" is discouraged outside decimal fractions to avoid surprises. Task-number: QTBUG-53565 Change-Id: Ia19de85ad35e4eb7bb95fffd14792caf9b4a5156 Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>bb10
parent
e1d7f7dfbc
commit
bcd19b723a
|
|
@ -1642,10 +1642,14 @@ QString QTime::toString(Qt::DateFormat format) const
|
|||
\li the hour with a leading zero (00 to 23, even with AM/PM display)
|
||||
\row \li m \li the minute without a leading zero (0 to 59)
|
||||
\row \li mm \li the minute with a leading zero (00 to 59)
|
||||
\row \li s \li the second without a leading zero (0 to 59)
|
||||
\row \li ss \li the second with a leading zero (00 to 59)
|
||||
\row \li z \li the milliseconds without leading zeroes (0 to 999)
|
||||
\row \li zzz \li the milliseconds with leading zeroes (000 to 999)
|
||||
\row \li s \li the whole second, without any leading zero (0 to 59)
|
||||
\row \li ss \li the whole second, with a leading zero where applicable (00 to 59)
|
||||
\row \li z \li the fractional part of the second, to go after a decimal
|
||||
point, without trailing zeroes (0 to 999). Thus "\c{s.z}"
|
||||
reports the seconds to full available (millisecond) precision
|
||||
without trailing zeroes.
|
||||
\row \li zzz \li the fractional part of the second, to millisecond
|
||||
precision, including trailing zeroes where applicable (000 to 999).
|
||||
\row \li AP or A
|
||||
\li use AM/PM display. \e A/AP will be replaced by either
|
||||
QLocale::amText() or QLocale::pmText().
|
||||
|
|
@ -1991,10 +1995,14 @@ QTime QTime::fromString(const QString& string, Qt::DateFormat format)
|
|||
\li the hour with a leading zero (00 to 23 or 01 to 12 if AM/PM display)
|
||||
\row \li m \li the minute without a leading zero (0 to 59)
|
||||
\row \li mm \li the minute with a leading zero (00 to 59)
|
||||
\row \li s \li the second without a leading zero (0 to 59)
|
||||
\row \li ss \li the second with a leading zero (00 to 59)
|
||||
\row \li z \li the milliseconds without leading zeroes (0 to 999)
|
||||
\row \li zzz \li the milliseconds with leading zeroes (000 to 999)
|
||||
\row \li s \li the whole second, without any leading zero (0 to 59)
|
||||
\row \li ss \li the whole second, with a leading zero where applicable (00 to 59)
|
||||
\row \li z \li the fractional part of the second, to go after a decimal
|
||||
point, without trailing zeroes (0 to 999). Thus "\c{s.z}"
|
||||
reports the seconds to full available (millisecond) precision
|
||||
without trailing zeroes.
|
||||
\row \li zzz \li the fractional part of the second, to millisecond
|
||||
precision, including trailing zeroes where applicable (000 to 999).
|
||||
\row \li AP
|
||||
\li interpret as an AM/PM time. \e AP must be either "AM" or "PM".
|
||||
\row \li ap
|
||||
|
|
@ -3895,10 +3903,14 @@ QString QDateTime::toString(Qt::DateFormat format) const
|
|||
\li the hour with a leading zero (00 to 23, even with AM/PM display)
|
||||
\row \li m \li the minute without a leading zero (0 to 59)
|
||||
\row \li mm \li the minute with a leading zero (00 to 59)
|
||||
\row \li s \li the second without a leading zero (0 to 59)
|
||||
\row \li ss \li the second with a leading zero (00 to 59)
|
||||
\row \li z \li the milliseconds without leading zeroes (0 to 999)
|
||||
\row \li zzz \li the milliseconds with leading zeroes (000 to 999)
|
||||
\row \li s \li the whole second without a leading zero (0 to 59)
|
||||
\row \li ss \li the whole second with a leading zero where applicable (00 to 59)
|
||||
\row \li z \li the fractional part of the second, to go after a decimal
|
||||
point, without trailing zeroes (0 to 999). Thus "\c{s.z}"
|
||||
reports the seconds to full available (millisecond) precision
|
||||
without trailing zeroes.
|
||||
\row \li zzz \li the fractional part of the second, to millisecond
|
||||
precision, including trailing zeroes where applicable (000 to 999).
|
||||
\row \li AP or A
|
||||
\li use AM/PM display. \e A/AP will be replaced by either "AM" or "PM".
|
||||
\row \li ap or a
|
||||
|
|
@ -3912,13 +3924,14 @@ QString QDateTime::toString(Qt::DateFormat format) const
|
|||
in the output. Formats without separators (e.g. "HHmm") are currently not supported.
|
||||
|
||||
Example format strings (assumed that the QDateTime is 21 May 2001
|
||||
14:13:09):
|
||||
14:13:09.120):
|
||||
|
||||
\table
|
||||
\header \li Format \li Result
|
||||
\row \li dd.MM.yyyy \li 21.05.2001
|
||||
\row \li ddd MMMM d yy \li Tue May 21 01
|
||||
\row \li hh:mm:ss.zzz \li 14:13:09.042
|
||||
\row \li hh:mm:ss.zzz \li 14:13:09.120
|
||||
\row \li hh:mm:ss.z \li 14:13:09.12
|
||||
\row \li h:m:s ap \li 2:13:9 pm
|
||||
\endtable
|
||||
|
||||
|
|
@ -4918,10 +4931,14 @@ QDateTime QDateTime::fromString(const QString& string, Qt::DateFormat format)
|
|||
\li the hour with a leading zero (00 to 23, even with AM/PM display)
|
||||
\row \li m \li the minute without a leading zero (0 to 59)
|
||||
\row \li mm \li the minute with a leading zero (00 to 59)
|
||||
\row \li s \li the second without a leading zero (0 to 59)
|
||||
\row \li ss \li the second with a leading zero (00 to 59)
|
||||
\row \li z \li the milliseconds without leading zeroes (0 to 999)
|
||||
\row \li zzz \li the milliseconds with leading zeroes (000 to 999)
|
||||
\row \li s \li the whole second without a leading zero (0 to 59)
|
||||
\row \li ss \li the whole second with a leading zero where applicable (00 to 59)
|
||||
\row \li z \li the fractional part of the second, to go after a decimal
|
||||
point, without trailing zeroes (0 to 999). Thus "\c{s.z}"
|
||||
reports the seconds to full available (millisecond) precision
|
||||
without trailing zeroes.
|
||||
\row \li zzz \li the fractional part of the second, to millisecond
|
||||
precision, including trailing zeroes where applicable (000 to 999).
|
||||
\row \li AP or A
|
||||
\li interpret as an AM/PM time. \e AP must be either "AM" or "PM".
|
||||
\row \li ap or a
|
||||
|
|
|
|||
|
|
@ -2742,14 +2742,17 @@ QString QLocalePrivate::dateTimeToString(const QString &format, const QDateTime
|
|||
} else {
|
||||
repeat = 1;
|
||||
}
|
||||
switch (repeat) {
|
||||
case 1:
|
||||
result.append(m_data->longLongToString(time.msec()));
|
||||
break;
|
||||
case 3:
|
||||
result.append(m_data->longLongToString(time.msec(), -1, 10, 3, QLocaleData::ZeroPadded));
|
||||
break;
|
||||
|
||||
// note: the millisecond component is treated like the decimal part of the seconds
|
||||
// so ms == 2 is always printed as "002", but ms == 200 can be either "2" or "200"
|
||||
result.append(m_data->longLongToString(time.msec(), -1, 10, 3, QLocaleData::ZeroPadded));
|
||||
if (repeat == 1) {
|
||||
if (result.endsWith(zero()))
|
||||
result.chop(1);
|
||||
if (result.endsWith(zero()))
|
||||
result.chop(1);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 't':
|
||||
|
|
|
|||
|
|
@ -1302,10 +1302,11 @@ void tst_QLocale::formatTime_data()
|
|||
QTest::newRow("28") << QTime(1, 2, 3, 456) << "H:m:s.z" << "1:2:3.456";
|
||||
QTest::newRow("29") << QTime(1, 2, 3, 456) << "H:m:s.zz" << "1:2:3.456456";
|
||||
QTest::newRow("30") << QTime(1, 2, 3, 456) << "H:m:s.zzz" << "1:2:3.456";
|
||||
QTest::newRow("31") << QTime(1, 2, 3, 4) << "H:m:s.z" << "1:2:3.4";
|
||||
QTest::newRow("32") << QTime(1, 2, 3, 4) << "H:m:s.zzz" << "1:2:3.004";
|
||||
QTest::newRow("33") << QTime() << "H:m:s.zzz" << "";
|
||||
QTest::newRow("34") << QTime(1, 2, 3, 4) << "dd MM yyyy H:m:s.zzz" << "dd MM yyyy 1:2:3.004";
|
||||
QTest::newRow("31") << QTime(1, 2, 3, 400) << "H:m:s.z" << "1:2:3.4";
|
||||
QTest::newRow("32") << QTime(1, 2, 3, 4) << "H:m:s.z" << "1:2:3.004";
|
||||
QTest::newRow("33") << QTime(1, 2, 3, 4) << "H:m:s.zzz" << "1:2:3.004";
|
||||
QTest::newRow("34") << QTime() << "H:m:s.zzz" << "";
|
||||
QTest::newRow("35") << QTime(1, 2, 3, 4) << "dd MM yyyy H:m:s.zzz" << "dd MM yyyy 1:2:3.004";
|
||||
}
|
||||
|
||||
void tst_QLocale::formatTime()
|
||||
|
|
@ -1542,10 +1543,12 @@ void tst_QLocale::toDateTime_data()
|
|||
<< "d/M/yyyy hh:h:mm" << "1/12/1974 05:5:14";
|
||||
QTest::newRow("2C") << "C" << QDateTime(QDate(1974, 12, 1), QTime(15, 0, 0))
|
||||
<< "d/M/yyyyy h" << "1/12/1974y 15";
|
||||
QTest::newRow("4C") << "C" << QDateTime(QDate(1974, 1, 1), QTime(0, 0, 0))
|
||||
<< "d/M/yyyy zzz" << "1/1/1974 000";
|
||||
QTest::newRow("5C") << "C" << QDateTime(QDate(1974, 1, 1), QTime(0, 0, 0))
|
||||
<< "dd/MM/yyy z" << "01/01/74y 0";
|
||||
QTest::newRow("4C") << "C" << QDateTime(QDate(1974, 1, 1), QTime(0, 0, 0, 1))
|
||||
<< "d/M/yyyy zzz" << "1/1/1974 001";
|
||||
QTest::newRow("5C") << "C" << QDateTime(QDate(1974, 1, 1), QTime(0, 0, 0, 1))
|
||||
<< "dd/MM/yyy z" << "01/01/74y 001";
|
||||
QTest::newRow("5Cbis") << "C" << QDateTime(QDate(1974, 1, 1), QTime(0, 0, 0, 100))
|
||||
<< "dd/MM/yyy z" << "01/01/74y 1";
|
||||
QTest::newRow("8C") << "C" << QDateTime(QDate(1974, 12, 2), QTime(0, 0, 13))
|
||||
<< "ddddd/MMMMM/yy ss" << "Monday2/December12/74 13";
|
||||
QTest::newRow("9C") << "C" << QDateTime(QDate(1974, 12, 1), QTime(0, 0, 13))
|
||||
|
|
|
|||
|
|
@ -560,6 +560,8 @@ void tst_QTime::fromStringFormat_data()
|
|||
QTest::newRow("data9") << QString("2221") << QString("hhhh") << invalidTime();
|
||||
QTest::newRow("data10") << QString("02:23PM") << QString("hh:mmAP") << QTime(14,23,0,0);
|
||||
QTest::newRow("data11") << QString("02:23pm") << QString("hh:mmap") << QTime(14,23,0,0);
|
||||
QTest::newRow("short-msecs-lt100") << QString("10:12:34:045") << QString("hh:m:ss:z") << QTime(10,12,34,45);
|
||||
QTest::newRow("short-msecs-gt100") << QString("10:12:34:45") << QString("hh:m:ss:z") << QTime(10,12,34,450);
|
||||
}
|
||||
|
||||
void tst_QTime::fromStringFormat()
|
||||
|
|
@ -711,12 +713,13 @@ void tst_QTime::toStringFormat_data()
|
|||
QTest::addColumn<QString>("format");
|
||||
QTest::addColumn<QString>("str");
|
||||
|
||||
QTest::newRow( "data0" ) << QTime(0,0,0,0) << QString("h:m:s:z") << QString("0:0:0:0");
|
||||
QTest::newRow( "data1" ) << QTime(10,12,34,53) << QString("hh:mm:ss:zzz") << QString("10:12:34:053");
|
||||
QTest::newRow( "data2" ) << QTime(10,12,34,45) << QString("hh:m:ss:z") << QString("10:12:34:45");
|
||||
QTest::newRow( "data3" ) << QTime(10,12,34,45) << QString("hh:ss ap") << QString("10:34 am");
|
||||
QTest::newRow( "data4" ) << QTime(22,12,34,45) << QString("hh:zzz AP") << QString("10:045 PM");
|
||||
QTest::newRow( "data5" ) << QTime(230,230,230,230) << QString("hh:mm:ss") << QString();
|
||||
QTest::newRow( "midnight" ) << QTime(0,0,0,0) << QString("h:m:s:z") << QString("0:0:0:0");
|
||||
QTest::newRow( "full" ) << QTime(10,12,34,53) << QString("hh:mm:ss:zzz") << QString("10:12:34:053");
|
||||
QTest::newRow( "short-msecs-lt100" ) << QTime(10,12,34,45) << QString("hh:m:ss:z") << QString("10:12:34:045");
|
||||
QTest::newRow( "short-msecs-gt100" ) << QTime(10,12,34,450) << QString("hh:m:ss:z") << QString("10:12:34:45");
|
||||
QTest::newRow( "am-pm" ) << QTime(10,12,34,45) << QString("hh:ss ap") << QString("10:34 am");
|
||||
QTest::newRow( "AM-PM" ) << QTime(22,12,34,45) << QString("hh:zzz AP") << QString("10:045 PM");
|
||||
QTest::newRow( "invalid" ) << QTime(230,230,230,230) << QString("hh:mm:ss") << QString();
|
||||
}
|
||||
|
||||
void tst_QTime::toStringFormat()
|
||||
|
|
|
|||
Loading…
Reference in New Issue