Make public QLocale's constant for the two-digit-year base

The private QLocale::FirstTwoDigitYear constant, which is used as a
default value for the parameters in some methods, causes troubles for
Qt for Python Team, because they need to use the default values in the
binding code. It also potentially create some inconveniences for the
users who want to write functions wrapping these methods.

The name is also confusing, because, when read out of context, it
implies that there might be SecondTwoDigitYear, etc...
Rename QLocale::FirstTwoDigitYear to QLocale::DefaultTwoDigitBaseYear
and make it public.

Now when the constant is public, we can use it in QDate, instead of
introducing another constant, so do that.
The qdatetime.h header already includes qlocale.h via qcalendar.h,
but, rather than relying on this transitive include, add it
explicitly.

As pointed out by Thiago [1], the static constexpr members of exported
classes need out-of-line definitions, so add such definition to
qlocale.cpp.

Amends 41f84f3ddb780ec751e3fc706dd242fc4a99de7a

Found in 6.7 API review.

[1]: https://lists.qt-project.org/pipermail/development/2024-January/044888.html

Change-Id: Ib3c6f1d5b181968bf311fd0435173e025a369865
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
Reviewed-by: Marc Mutz <marc.mutz@qt.io>
(cherry picked from commit cde7d5d3ff56fdf219771c65bf93f3f08757f154)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
Ivan Solovev 2024-01-17 16:30:03 +01:00 committed by Qt Cherry-pick Bot
parent 4f1752a6b9
commit c32b15f119
5 changed files with 53 additions and 33 deletions

View File

@ -794,42 +794,42 @@ QString QLocale::bcp47Name() const
QDate QLocale::toDate(const QString &string, FormatType format) const
{
return toDate(string, dateFormat(format), FirstTwoDigitYear);
return toDate(string, dateFormat(format), DefaultTwoDigitBaseYear);
}
QDate QLocale::toDate(const QString &string, FormatType format, QCalendar cal) const
{
return toDate(string, dateFormat(format), cal, FirstTwoDigitYear);
return toDate(string, dateFormat(format), cal, DefaultTwoDigitBaseYear);
}
QDateTime QLocale::toDateTime(const QString &string, FormatType format) const
{
return toDateTime(string, dateTimeFormat(format), FirstTwoDigitYear);
return toDateTime(string, dateTimeFormat(format), DefaultTwoDigitBaseYear);
}
QDateTime QLocale::toDateTime(const QString &string, FormatType format, QCalendar cal) const
{
return toDateTime(string, dateTimeFormat(format), cal, FirstTwoDigitYear);
return toDateTime(string, dateTimeFormat(format), cal, DefaultTwoDigitBaseYear);
}
QDate QLocale::toDate(const QString &string, const QString &format) const
{
return toDate(string, format, QCalendar(), FirstTwoDigitYear);
return toDate(string, format, QCalendar(), DefaultTwoDigitBaseYear);
}
QDate QLocale::toDate(const QString &string, const QString &format, QCalendar cal) const
{
return toDate(string, format, cal, FirstTwoDigitYear);
return toDate(string, format, cal, DefaultTwoDigitBaseYear);
}
QDateTime QLocale::toDateTime(const QString &string, const QString &format) const
{
return toDateTime(string, format, QCalendar(), FirstTwoDigitYear);
return toDateTime(string, format, QCalendar(), DefaultTwoDigitBaseYear);
}
QDateTime QLocale::toDateTime(const QString &string, const QString &format, QCalendar cal) const
{
return toDateTime(string, format, cal, FirstTwoDigitYear);
return toDateTime(string, format, cal, DefaultTwoDigitBaseYear);
}
#include "qobject.h"

View File

@ -54,6 +54,8 @@ QT_WARNING_DISABLE_GCC("-Wfree-nonheap-object") // false positive tracking
QT_BEGIN_NAMESPACE
constexpr int QLocale::DefaultTwoDigitBaseYear;
QT_IMPL_METATYPE_EXTERN_TAGGED(QList<Qt::DayOfWeek>, QList_Qt__DayOfWeek)
#ifndef QT_NO_SYSTEMLOCALE
QT_IMPL_METATYPE_EXTERN_TAGGED(QSystemLocale::CurrencyToStringArgument,
@ -1001,6 +1003,21 @@ QLocale::QLocale(QLocalePrivate &dd)
: d(&dd)
{}
/*!
\variable QLocale::DefaultTwoDigitBaseYear
\since 6.7
\brief The default start year of the century within which a format taking
a two-digit year will select. The value of the constant is \c {1900}.
Some locales use, particularly for ShortFormat, only the last two digits of
the year. Proir to 6.7 the year 1900 was always used as a base year for
such cases. Now various QLocale and QDate functions have the overloads that
allow callers to specify the base year, and this constant is used as its
default value.
\sa toDate(), toDateTime(), QDate::fromString(), QDateTime::fromString()
*/
/*!
\since 6.3

View File

@ -35,9 +35,9 @@ class Q_CORE_EXPORT QLocale
friend class QTextStream;
friend class QTextStreamPrivate;
static constexpr int FirstTwoDigitYear = 1900; // sync with QDate
public:
static constexpr int DefaultTwoDigitBaseYear = 1900;
// see qlocale_data_p.h for more info on generated data
// GENERATED PART STARTS HERE
enum Language : ushort {
@ -1030,22 +1030,22 @@ public:
QDateTime toDateTime(const QString &string, const QString &format, QCalendar cal) const;
# endif
QDate toDate(const QString &string, FormatType = LongFormat,
int baseYear = FirstTwoDigitYear) const;
int baseYear = DefaultTwoDigitBaseYear) const;
QDate toDate(const QString &string, const QString &format,
int baseYear = FirstTwoDigitYear) const;
int baseYear = DefaultTwoDigitBaseYear) const;
QDateTime toDateTime(const QString &string, FormatType format = LongFormat,
int baseYear = FirstTwoDigitYear) const;
int baseYear = DefaultTwoDigitBaseYear) const;
QDateTime toDateTime(const QString &string, const QString &format,
int baseYear = FirstTwoDigitYear) const;
int baseYear = DefaultTwoDigitBaseYear) const;
// Calendar-aware API
QDate toDate(const QString &string, FormatType format, QCalendar cal,
int baseYear = FirstTwoDigitYear) const;
int baseYear = DefaultTwoDigitBaseYear) const;
QDate toDate(const QString &string, const QString &format, QCalendar cal,
int baseYear = FirstTwoDigitYear) const;
int baseYear = DefaultTwoDigitBaseYear) const;
QDateTime toDateTime(const QString &string, FormatType format, QCalendar cal,
int baseYear = FirstTwoDigitYear) const;
int baseYear = DefaultTwoDigitBaseYear) const;
QDateTime toDateTime(const QString &string, const QString &format, QCalendar cal,
int baseYear = FirstTwoDigitYear) const;
int baseYear = DefaultTwoDigitBaseYear) const;
#endif
QString decimalPoint() const;

View File

@ -7,6 +7,7 @@
#include <QtCore/qcalendar.h>
#include <QtCore/qcompare.h>
#include <QtCore/qlocale.h>
#include <QtCore/qnamespace.h>
#include <QtCore/qshareddata.h>
#include <QtCore/qstring.h>
@ -27,7 +28,6 @@ class QDateTime;
class Q_CORE_EXPORT QDate
{
explicit constexpr QDate(qint64 julianDay) : jd(julianDay) {}
static constexpr int FirstTwoDigitYear = 1900; // sync with QLocale
public:
constexpr QDate() : jd(nullJd()) {}
QDate(int y, int m, int d);
@ -135,21 +135,24 @@ public:
// Accept calendar without over-ride of base year:
static QDate fromString(QStringView string, QStringView format, QCalendar cal)
{ return fromString(string.toString(), format, FirstTwoDigitYear, cal); }
{ return fromString(string.toString(), format, QLocale::DefaultTwoDigitBaseYear, cal); }
QT_CORE_INLINE_SINCE(6, 7)
static QDate fromString(const QString &string, QStringView format, QCalendar cal);
static QDate fromString(const QString &string, const QString &format, QCalendar cal)
{ return fromString(string, qToStringViewIgnoringNull(format), FirstTwoDigitYear, cal); }
{ return fromString(string, qToStringViewIgnoringNull(format), QLocale::DefaultTwoDigitBaseYear, cal); }
// Overriding base year is likely more common than overriding calendar (and
// likely to get more so, as the legacy base drops ever further behind us).
static QDate fromString(QStringView string, QStringView format,
int baseYear = FirstTwoDigitYear, QCalendar cal = QCalendar())
int baseYear = QLocale::DefaultTwoDigitBaseYear,
QCalendar cal = QCalendar())
{ return fromString(string.toString(), format, baseYear, cal); }
static QDate fromString(const QString &string, QStringView format,
int baseYear = FirstTwoDigitYear, QCalendar cal = QCalendar());
int baseYear = QLocale::DefaultTwoDigitBaseYear,
QCalendar cal = QCalendar());
static QDate fromString(const QString &string, const QString &format,
int baseYear = FirstTwoDigitYear, QCalendar cal = QCalendar())
int baseYear = QLocale::DefaultTwoDigitBaseYear,
QCalendar cal = QCalendar())
{ return fromString(string, qToStringViewIgnoringNull(format), baseYear, cal); }
#endif
static bool isValid(int y, int m, int d);
@ -439,23 +442,23 @@ public:
// Accept calendar without over-ride of base year:
static QDateTime fromString(QStringView string, QStringView format, QCalendar cal)
{ return fromString(string.toString(), format, QDate::FirstTwoDigitYear, cal); }
{ return fromString(string.toString(), format, QLocale::DefaultTwoDigitBaseYear, cal); }
QT_CORE_INLINE_SINCE(6, 7)
static QDateTime fromString(const QString &string, QStringView format, QCalendar cal);
static QDateTime fromString(const QString &string, const QString &format, QCalendar cal)
{ return fromString(string, qToStringViewIgnoringNull(format), QDate::FirstTwoDigitYear, cal); }
{ return fromString(string, qToStringViewIgnoringNull(format), QLocale::DefaultTwoDigitBaseYear, cal); }
// Overriding base year is likely more common than overriding calendar (and
// likely to get more so, as the legacy base drops ever further behind us).
static QDateTime fromString(QStringView string, QStringView format,
int baseYear = QDate::FirstTwoDigitYear,
int baseYear = QLocale::DefaultTwoDigitBaseYear,
QCalendar cal = QCalendar())
{ return fromString(string.toString(), format, baseYear, cal); }
static QDateTime fromString(const QString &string, QStringView format,
int baseYear = QDate::FirstTwoDigitYear,
int baseYear = QLocale::DefaultTwoDigitBaseYear,
QCalendar cal = QCalendar());
static QDateTime fromString(const QString &string, const QString &format,
int baseYear = QDate::FirstTwoDigitYear,
int baseYear = QLocale::DefaultTwoDigitBaseYear,
QCalendar cal = QCalendar())
{ return fromString(string, qToStringViewIgnoringNull(format), baseYear, cal); }
#endif
@ -626,12 +629,12 @@ Q_CORE_EXPORT size_t qHash(QTime key, size_t seed = 0) noexcept;
#if QT_CORE_INLINE_IMPL_SINCE(6, 7)
QDate QDate::fromString(const QString &string, QStringView format, QCalendar cal)
{
return fromString(string, format, FirstTwoDigitYear, cal);
return fromString(string, format, QLocale::DefaultTwoDigitBaseYear, cal);
}
QDateTime QDateTime::fromString(const QString &string, QStringView format, QCalendar cal)
{
return fromString(string, format, QDate::FirstTwoDigitYear, cal);
return fromString(string, format, QLocale::DefaultTwoDigitBaseYear, cal);
}
#endif

View File

@ -137,7 +137,7 @@ public:
StateNode parse(const QString &input, int position,
const QDateTime &defaultValue, bool fixup) const;
bool fromString(const QString &text, QDate *date, QTime *time,
int baseYear = QDate::FirstTwoDigitYear) const;
int baseYear = QLocale::DefaultTwoDigitBaseYear) const;
bool fromString(const QString &text, QDateTime *datetime, int baseYear) const;
bool parseFormat(QStringView format);
@ -236,7 +236,7 @@ protected: // for the benefit of QDateTimeEditPrivate
virtual QLocale locale() const { return defaultLocale; }
mutable int currentSectionIndex = int(NoSectionIndex);
mutable int defaultCenturyStart = QDate::FirstTwoDigitYear;
mutable int defaultCenturyStart = QLocale::DefaultTwoDigitBaseYear;
Sections display;
/*
This stores the most recently selected day.