diff options
author | Edward Welbourne <edward.welbourne@qt.io> | 2023-11-08 17:08:49 +0100 |
---|---|---|
committer | Edward Welbourne <edward.welbourne@qt.io> | 2023-12-08 11:40:36 +0100 |
commit | 41f84f3ddb780ec751e3fc706dd242fc4a99de7a (patch) | |
tree | c513e83065b9a62f11ed26270af58f336af81424 /src/corelib/time/qdatetime.cpp | |
parent | b8fac538032cee6eb6f4e5dcbb5a31485bb59e46 (diff) |
Give the caller control over the century used for two-digit dates
The twentieth century is now some way behind us, so using its years
when parsing a date-time format that only provides the last two digits
is increasingly likely to produce unwelcome results. Most such formats
are saved by the "redundant" presence of a day-of-week field but, for
those that are not (notably including ASN.1 date fields), there is a
need to provide some way to over-ride the twentieth century default.
Allow the caller to pass a base year to the fromString() methods, of
QDate and QDateTime, and to QLocale's toDate() and toDateTime(), that
indicates the first of 100 consecutive years, among which the two
digits given can select a year. Add some test-cases to exercise the
new API.
[ChangeLog][QtCore][QDate] When fromString() has only a two-digit year
to go on, it is now possible to set the start-year of the century
within which this selects.
[ChangeLog][QtCore][QDateTime] When fromString() has only a two-digit
year to go on, it is now possible to set the start-year of the century
within which this selects.
[ChangeLog][QtCore][QLocale] When toDate() or toDateTime() has only a
two-digit year to go on, it is now possible to set the start-year of
the century within which this selects.
Fixes: QTBUG-46843
Change-Id: Ieb312ee9e0b80557a15edcb0e6d75a57b10d7a62
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: MÃ¥rten Nordheim <marten.nordheim@qt.io>
Diffstat (limited to 'src/corelib/time/qdatetime.cpp')
-rw-r--r-- | src/corelib/time/qdatetime.cpp | 64 |
1 files changed, 57 insertions, 7 deletions
diff --git a/src/corelib/time/qdatetime.cpp b/src/corelib/time/qdatetime.cpp index 273c38767a..99f6522abd 100644 --- a/src/corelib/time/qdatetime.cpp +++ b/src/corelib/time/qdatetime.cpp @@ -1670,7 +1670,7 @@ QDate QDate::fromString(QStringView string, Qt::DateFormat format) } /*! - \fn QDate QDate::fromString(const QString &string, const QString &format, QCalendar cal) + \fn QDate QDate::fromString(const QString &string, const QString &format, int baseYear, QCalendar cal) Returns the QDate represented by the \a string, using the \a format given, or an invalid date if the string cannot be parsed. @@ -1720,11 +1720,19 @@ QDate QDate::fromString(QStringView string, Qt::DateFormat format) \table \header \li Field \li Default value - \row \li Year \li 1900 + \row \li Year \li \a baseYear (or 1900) \row \li Month \li 1 (January) \row \li Day \li 1 \endtable + When \a format only specifies the last two digits of a year, the 100 years + starting at \a baseYear are the candidates first considered. Prior to 6.7 + there was no \a baseYear parameter and 1900 was always used. This is the + default for \a baseYear, selecting a year from then to 1999. Passing 1976 as + \a baseYear will select a year from 1976 through 2075, for example. In some + cases, other fields may lead to the next or previous century being selected, + to get a result consistent with all fields given. + The following examples demonstrate the default values: \snippet code/src_corelib_time_qdatetime.cpp 3 @@ -1751,21 +1759,40 @@ QDate QDate::fromString(QStringView string, Qt::DateFormat format) \overload \since 6.0 */ -QDate QDate::fromString(const QString &string, QStringView format, QCalendar cal) +QDate QDate::fromString(const QString &string, QStringView format, int baseYear, QCalendar cal) { QDate date; #if QT_CONFIG(datetimeparser) QDateTimeParser dt(QMetaType::QDate, QDateTimeParser::FromString, cal); dt.setDefaultLocale(QLocale::c()); if (dt.parseFormat(format)) - dt.fromString(string, &date, nullptr); + dt.fromString(string, &date, nullptr, baseYear); #else Q_UNUSED(string); Q_UNUSED(format); + Q_UNUSED(baseYear); Q_UNUSED(cal); #endif return date; } + +/*! + \fn QDate QDate::fromString(const QString &string, const QString &format, QCalendar cal) + \overload + \since 5.14 +*/ + +/*! + \fn QDate QDate::fromString(const QString &string, QStringView format, QCalendar cal) + \overload + \since 6.0 +*/ + +/*! + \fn QDate QDate::fromString(QStringView string, QStringView format, int baseYear, QCalendar cal) + \overload + \since 6.7 +*/ #endif // datestring /*! @@ -5636,13 +5663,15 @@ QDateTime QDateTime::fromString(QStringView string, Qt::DateFormat format) } /*! - \fn QDateTime QDateTime::fromString(const QString &string, const QString &format, QCalendar cal) + \fn QDateTime QDateTime::fromString(const QString &string, const QString &format, int baseYear, QCalendar cal) Returns the QDateTime represented by the \a string, using the \a format given, or an invalid datetime if the string cannot be parsed. Uses the calendar \a cal if supplied, else Gregorian. + \include qlocale.cpp base-year-for-two-digit + In addition to the expressions, recognized in the format string to represent parts of the date and time, by QDate::fromString() and QTime::fromString(), this method supports: @@ -5730,23 +5759,44 @@ QDateTime QDateTime::fromString(QStringView string, Qt::DateFormat format) \overload \since 6.0 */ -QDateTime QDateTime::fromString(const QString &string, QStringView format, QCalendar cal) +QDateTime QDateTime::fromString(const QString &string, QStringView format, int baseYear, + QCalendar cal) { #if QT_CONFIG(datetimeparser) QDateTime datetime; QDateTimeParser dt(QMetaType::QDateTime, QDateTimeParser::FromString, cal); dt.setDefaultLocale(QLocale::c()); - if (dt.parseFormat(format) && (dt.fromString(string, &datetime) || !datetime.isValid())) + if (dt.parseFormat(format) && (dt.fromString(string, &datetime, baseYear) + || !datetime.isValid())) { return datetime; + } #else Q_UNUSED(string); Q_UNUSED(format); + Q_UNUSED(baseYear); Q_UNUSED(cal); #endif return QDateTime(); } +/*! + \fn QDateTime QDateTime::fromString(const QString &string, const QString &format, QCalendar cal) + \overload + \since 5.14 +*/ + +/*! + \fn QDateTime QDateTime::fromString(const QString &string, QStringView format, QCalendar cal) + \overload + \since 6.0 +*/ + +/*! + \fn QDateTime QDateTime::fromString(QStringView string, QStringView format, int baseYear, QCalendar cal) + \overload + \since 6.7 +*/ #endif // datestring /***************************************************************************** |