Return a more useful date-time on parser failure in spring-forward gap
Up to 5.15.0, QDateTime::fromString(), when parsing a string that
matched the format but represented a date-time in a spring-forward's
gap, would return an invalid date-time object that represented a "best
shot" date-time, correcting the error in the string as best it could.
In 5.15, in order to handle time-spec information correctly, we
adapted the date-time parser to have a fromString() variant that
parsed a date-time as a whole, rather than as a date and a time; as a
result, QDTP::fromString() now returns false and QDT::fromString()
returned a default-constructed instance instead of the invalid
date-time that QDTP had produced.
Amend 7605451604 to restore the prior
behavior of returning the invalid date-time object from QDTP instead
of a default-constructed invalid date-time. Also document what this
implies for the caller's ability to recover from the situation, if a
best shot result is better than nothing.
[ChangeLog][QtCore][QDateTime] Restored pre-5.15.0 behavior when
parsing a date-time from a string (and document what it implies): if
the string has the right form but represents a date-time that was
skipped by a time-zone transition (e.g. a DST spring-forward), the
invalid date-time object returned can, none the less, be used to
recover a near-by date-time that may be more useful in some cases.
From 5.15.0 to 5.15.2 and in 6.0.0, a default-constructed QDateTime
was returned in place of this more informative invalid date-time.
Task-number: QTBUG-88633
Pick-to: 6.0 5.15
Change-Id: If0b439038d5fe48eefb951c62f3aae2933bb5651
Reviewed-by: Andrei Golubev <andrei.golubev@qt.io>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
bb10
parent
cdcfb7c4f9
commit
3a4115d123
|
|
@ -2282,7 +2282,12 @@ QDate QLocale::toDate(const QString &string, const QString &format, QCalendar ca
|
|||
\note The month and day names used must be given in the user's local
|
||||
language.
|
||||
|
||||
If the string could not be parsed, returns an invalid QDateTime.
|
||||
If the string could not be parsed, returns an invalid QDateTime. If the
|
||||
string can be parsed and represents an invalid date-time (e.g. in a gap
|
||||
skipped by a time-zone transition), an invalid QDateTime is returned, whose
|
||||
toMSecsSinceEpoch() represents a near-by date-time that is valid. Passing
|
||||
that to fromMSecsSinceEpoch() will produce a valid date-time that isn't
|
||||
faithfully represented by the string parsed.
|
||||
|
||||
\sa dateTimeFormat(), toTime(), toDate(), QDateTime::fromString()
|
||||
*/
|
||||
|
|
@ -2302,7 +2307,7 @@ QDateTime QLocale::toDateTime(const QString &string, const QString &format, QCal
|
|||
|
||||
QDateTimeParser dt(QMetaType::QDateTime, QDateTimeParser::FromString, cal);
|
||||
dt.setDefaultLocale(*this);
|
||||
if (dt.parseFormat(format) && dt.fromString(string, &datetime))
|
||||
if (dt.parseFormat(format) && (dt.fromString(string, &datetime) || !datetime.isValid()))
|
||||
return datetime;
|
||||
#else
|
||||
Q_UNUSED(string);
|
||||
|
|
|
|||
|
|
@ -4977,7 +4977,13 @@ QDateTime QDateTime::fromString(QStringView string, Qt::DateFormat format)
|
|||
|
||||
\snippet code/src_corelib_time_qdatetime.cpp 12
|
||||
|
||||
If the format is not satisfied, an invalid QDateTime is returned.
|
||||
If the format is not satisfied, an invalid QDateTime is returned. If the
|
||||
format is satisfied but \a string represents an invalid date-time (e.g. in a
|
||||
gap skipped by a time-zone transition), an invalid QDateTime is returned,
|
||||
whose toMSecsSinceEpoch() represents a near-by date-time that is
|
||||
valid. Passing that to fromMSecsSinceEpoch() will produce a valid date-time
|
||||
that isn't faithfully represented by the string parsed.
|
||||
|
||||
The expressions that don't have leading zeroes (d, M, h, m, s, z) will be
|
||||
greedy. This means that they will use two digits (or three, for z) even if this will
|
||||
put them outside the range and/or leave too few digits for other
|
||||
|
|
@ -5025,7 +5031,7 @@ QDateTime QDateTime::fromString(const QString &string, QStringView format, QCale
|
|||
|
||||
QDateTimeParser dt(QMetaType::QDateTime, QDateTimeParser::FromString, cal);
|
||||
dt.setDefaultLocale(QLocale::c());
|
||||
if (dt.parseFormat(format) && dt.fromString(string, &datetime))
|
||||
if (dt.parseFormat(format) && (dt.fromString(string, &datetime) || !datetime.isValid()))
|
||||
return datetime;
|
||||
#else
|
||||
Q_UNUSED(string);
|
||||
|
|
|
|||
Loading…
Reference in New Issue