KDE Core/QtMerge/QDateTime: Difference between revisions
Line 5: | Line 5: | ||
== Full CLDR Date Format and Calendar System support == | == Full CLDR Date Format and Calendar System support == | ||
The CLDR Date Format support and Calendar System support are closely connected and need to be designed together, although they will be separately implemented. | The CLDR Date Format support and Calendar System support are closely connected and need to be designed together, although they will be separately implemented. The following API design is based on the CLDR standard. | ||
Backwards source compatibility is required to be maintained by the QDate class using the QT4_COMPAT directive. | |||
The Qt4 API is inconsistent, incomplete, and requires modification to fully support CLDR, so the opportunity should be taken to fully overhaul the API. Most apps will be unaffected as they should simply be using the default toString()/fromString() methods. | |||
=== Object Model === | === Object Model === | ||
Line 13: | Line 15: | ||
The physical object model is still uncertain. The logical model is as follows: | The physical object model is still uncertain. The logical model is as follows: | ||
QLocale - The locale container | QLocale - The locale class, container for type of calendar system, date/time formats, and date/time name translations, and accessor methods to format/parse date/times in that locale. Existing class to be modified. | ||
QDate - | QDate - A container class to hold a Julian Day number. Shouldn't have any ymd or string methods, but to maintain full backwards compatibility will use QT4_COMPAT for all existing ymd and string methods. | ||
QDateCalculator. A calculator class for converting a QDate to/from YMD values. No virtuals to be used. | |||
QDateTimeParser - Takes an input string, date/time format, and locale and returns a QDateTime. Existing private class to be modified. | |||
QDateTimeFormatter - Takes a QDateTime, date/time format and locale and returns a QString. New private class based on the QLocale formatter. The QDateTime formatter is to be deleted.. | |||
=== Implementation Plan === | === Implementation Plan === | ||
Line 33: | Line 29: | ||
The following phased implementation is planned: | The following phased implementation is planned: | ||
* Create new private QDateTimeFormatter class, move current formatting code from QLocale and QDateTime into QDateTimeFormatter, change QDateTime to make calls to it. All existing tests should still pass. | * Create new private QDateTimeFormatter class, move current formatting code from QLocale and QDateTime into QDateTimeFormatter, change QDateTime to make calls to it. All existing tests should still pass. | ||
* Create new private QDateCalculator base class implementing many calendars. | |||
* Change QDateTimeFormatter and QDateTimeParser to fix the currently supported field codes to be CLDR compliant. Modify existing tests to ensure they still pass. | * Change QDateTimeFormatter and QDateTimeParser to fix the currently supported field codes to be CLDR compliant. Modify existing tests to ensure they still pass. | ||
* Implement new formatting api but making calls to existing backend code, for options that don't yet have the backend coded just translate to a sensible replacement, i.e. for FullDate return LongDate. Only supported CalendarSystem is DefaultCalendar. All existing tests should still pass. | * Implement new formatting api but making calls to existing backend code, for options that don't yet have the backend coded just translate to a sensible replacement, i.e. for FullDate return LongDate. Only supported CalendarSystem is DefaultCalendar. All existing tests should still pass. | ||
Line 55: | Line 51: | ||
=== API Changes === | === API Changes === | ||
Deprecate the old Qt and QDate enums: | |||
<syntaxhighlight lang="cpp-qt"> | <syntaxhighlight lang="cpp-qt"> | ||
Line 75: | Line 71: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Delete or Deprecate the old QLocale enums: | |||
<syntaxhighlight lang="cpp-qt"> | |||
// Merges both format type and field type! | |||
enum QLocale::FormatType { LongFormat, ShortFormat, NarrowFormat }; | |||
</syntaxhighlight> | |||
Add new QLocale enums: | |||
<syntaxhighlight lang="cpp-qt"> | <syntaxhighlight lang="cpp-qt"> | ||
Line 96: | Line 99: | ||
// CLDR calendar attribute | // CLDR calendar attribute | ||
enum QLocale::CalendarSystem { DefaultCalendar = | enum QLocale::CalendarSystem { DefaultCalendar = 0, // i.e. locale default | ||
GregorianCalendar = | GregorianCalendar = 1, | ||
JulianCalendar = 2, | |||
... }; | ... }; | ||
// CLDR year type attribute | // CLDR year type attribute, in Qt or QDateTime namespace instead? | ||
enum QLocale::YearType { StandardYear, LeapYear } | enum QLocale::YearType { StandardYear, LeapYear } | ||
// CLDR date time fields, maybe in Qt or QLocale namespace? | |||
enum QDateTime::DateTimeField { Year, Month, Day, Hour, Minute, Second, ... } | |||
// Common standard formats, maybe in Qt or QLocale namespace? | |||
enum QDateTime::DateTimeFormat { IsoFormat, | enum QDateTime::DateTimeFormat { IsoFormat, | ||
RfcFormat, | RfcFormat, | ||
Line 111: | Line 118: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Add new QLocale calendar sytem methods: | |||
<syntaxhighlight lang="cpp-qt"> | |||
CalendarSystem QLocale::calendarSystem(); const // current calendar, usually locale default | |||
QList<CalendarSystem> QLocale::calendarSystems() const; // locale preferred list | |||
QList<CalendarSystem> QLocale::allCalendarSystems() const; // all calendars list | |||
QDateCalculator QLocale::calendar(); // current calendar calculator | |||
</syntaxhighlight> | |||
Deprecate the old QDate name methods: | |||
<syntaxhighlight lang="cpp-qt"> | |||
static QString QDate::shortMonthName(int month, MonthNameType type = QDate::DateFormat); | |||
static QString QDate::shortDayName(int weekday, MonthNameType type = QDate::DateFormat); | |||
static QString QDate::longMonthName(int month, MonthNameType type = QDate::DateFormat); | |||
static QString QDate::longDayName(int weekday, MonthNameType type = QDate::DateFormat); | |||
</syntaxhighlight> | |||
Delete or Deprecate the old QLocale name methods: | |||
<syntaxhighlight lang="cpp-qt"> | <syntaxhighlight lang="cpp-qt"> | ||
Line 122: | Line 146: | ||
QString QLocale::amText() const; | QString QLocale::amText() const; | ||
QString QLocale::pmText() const; | QString QLocale::pmText() const; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Add new QLocale name methods: | |||
<syntaxhighlight lang="cpp-qt"> | <syntaxhighlight lang="cpp-qt"> | ||
Line 145: | Line 164: | ||
FieldContext context = FormatContext, | FieldContext context = FormatContext, | ||
CalendarSystem calendar = DefaultCalendar) const; | CalendarSystem calendar = DefaultCalendar) const; | ||
QString QLocale::eraName(int year, | QString QLocale::eraName(int year, | ||
FieldFormat format = LongName, | FieldFormat format = LongName, | ||
Line 162: | Line 176: | ||
FieldContext context = FormatContext) const; | FieldContext context = FormatContext) const; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Modify the QLocale date/time format methods: | Modify the QLocale date/time format methods: | ||
Line 173: | Line 185: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
to | to replace FormatType with StringType: | ||
<syntaxhighlight lang="cpp-qt"> | |||
QString QLocale::dateFormat(StringFormat format = LongFormat) const; | |||
QString QLocale::timeFormat(StringFormat format = LongFormat) const; | |||
QString QLocale::dateTimeFormat(StringFormat format = LongFormat) const; | |||
</syntaxhighlight> | |||
Deprecate all the QDateTime toString() and fromString() methods: | |||
<syntaxhighlight lang="cpp-qt"> | <syntaxhighlight lang="cpp-qt"> | ||
QString | QString QDate::toString(Qt::DateFormat f = Qt::TextDate) const; | ||
QString | QString QDate::toString(const QString &format) const; | ||
QString | |||
static QDate QDate::fromString(const QString &s, Qt::DateFormat f = Qt::TextDate); | |||
static QDate QDate::fromString(const QString &s, const QString &format); | |||
QString QTime::toString(Qt::DateFormat f = Qt::TextDate) const; | |||
QString QTime::toString(const QString &format) const; | |||
static QTime QTime::fromString(const QString &s, Qt::DateFormat f = Qt::TextDate); | |||
static QTime QTime::fromString(const QString &s, const QString &format); | |||
QString QDateTime::toString(Qt::DateFormat f = Qt::TextDate) const; | |||
QString QDateTime::toString(const QString &format) const; | |||
static QDateTime QDateTime::fromString(const QString &s, Qt::DateFormat f = Qt::TextDate); | |||
static QDateTime QDateTime::fromString(const QString &s, const QString &format); | |||
</syntaxhighlight> | </syntaxhighlight> | ||
Mondify the QLocale toString() and fromString() methods: | |||
<syntaxhighlight lang="cpp-qt"> | |||
QString QLocale::toString(const QDate &date, FormatType format = LongFormat) const; | |||
QString QLocale::toString(const QTime &time, FormatType format = LongFormat) const; | |||
QString QLocale::toString(const QDateTime &dateTime, FormatType format = LongFormat) const; | |||
QDate QLocale::toDate(const QString &string, FormatType = LongFormat) const; | |||
QTime QLocale::toTime(const QString &string, FormatType = LongFormat) const; | |||
QDateTime QLocale::toDateTime(const QString &string, FormatType format = LongFormat) const; | |||
</syntaxhighlight> | |||
to replace FormatType with StringType: | |||
<syntaxhighlight lang="cpp-qt"> | <syntaxhighlight lang="cpp-qt"> | ||
QString | QString QLocale::toString(const QDate &date, StringType format = LongFormat) const; | ||
QString | QString QLocale::toString(const QTime &time, StringType format = LongFormat) const; | ||
QString | QString QLocale::toString(const QDateTime &dateTime, StringType format = LongFormat) const; | ||
QDate QLocale::toDate(const QString &string, StringType = LongFormat) const; | |||
QTime QLocale::toTime(const QString &string, StringType = LongFormat) const; | |||
QDateTime QLocale::toDateTime(const QString &string, StringType format = LongFormat) const; | |||
</syntaxhighlight> | </syntaxhighlight> | ||
Add the following new toString/fromSting methods to QLocale | |||
<syntaxhighlight lang="cpp-qt"> | |||
QString QLocale::toString(const QDate &date, QDateTime::DateTimeFormat format) const; | |||
QString QLocale::toString(const QTime &time, QDateTime::DateTimeFormat format) const; | |||
QString QLocale::toString(const QDateTime &dateTime, QDateTime::DateTimeFormat format) const; | |||
QDate QLocale::toDate(const QString &string, QDateTime::DateTimeFormat format) const; | |||
QTime QLocale::toTime(const QString &string, QDateTime::DateTimeFormat format) const; | |||
QDateTime QLocale::toDateTime(const QString &string, QDateTime::DateTimeFormat format) const; | |||
</syntaxhighlight> | |||
Modify the existing string date field format codes to be CLDR compliant as follows: | Modify the existing string date field format codes to be CLDR compliant as follows: | ||
Line 233: | Line 285: | ||
W - Week of Month | W - Week of Month | ||
F - Day of Week In Month | F - Day of Week In Month | ||
</syntaxhighlight> | </syntaxhighlight> |
Revision as of 19:55, 3 September 2011
The initial proposal for merging KDE features in Qt5 as presented at QtCS is documented on the QtCS wiki at http://developer.qt.nokia.com/groups/qt_contributors_summit/wiki/QDateTime
This page documents specific API proposals.
Full CLDR Date Format and Calendar System support
The CLDR Date Format support and Calendar System support are closely connected and need to be designed together, although they will be separately implemented. The following API design is based on the CLDR standard.
Backwards source compatibility is required to be maintained by the QDate class using the QT4_COMPAT directive.
The Qt4 API is inconsistent, incomplete, and requires modification to fully support CLDR, so the opportunity should be taken to fully overhaul the API. Most apps will be unaffected as they should simply be using the default toString()/fromString() methods.
Object Model
The physical object model is still uncertain. The logical model is as follows:
QLocale - The locale class, container for type of calendar system, date/time formats, and date/time name translations, and accessor methods to format/parse date/times in that locale. Existing class to be modified.
QDate - A container class to hold a Julian Day number. Shouldn't have any ymd or string methods, but to maintain full backwards compatibility will use QT4_COMPAT for all existing ymd and string methods.
QDateCalculator. A calculator class for converting a QDate to/from YMD values. No virtuals to be used.
QDateTimeParser - Takes an input string, date/time format, and locale and returns a QDateTime. Existing private class to be modified.
QDateTimeFormatter - Takes a QDateTime, date/time format and locale and returns a QString. New private class based on the QLocale formatter. The QDateTime formatter is to be deleted..
Implementation Plan
The following phased implementation is planned:
- Create new private QDateTimeFormatter class, move current formatting code from QLocale and QDateTime into QDateTimeFormatter, change QDateTime to make calls to it. All existing tests should still pass.
- Create new private QDateCalculator base class implementing many calendars.
- Change QDateTimeFormatter and QDateTimeParser to fix the currently supported field codes to be CLDR compliant. Modify existing tests to ensure they still pass.
- Implement new formatting api but making calls to existing backend code, for options that don't yet have the backend coded just translate to a sensible replacement, i.e. for FullDate return LongDate. Only supported CalendarSystem is DefaultCalendar. All existing tests should still pass.
- Add to QDateTimeFormatter and QDateTimeParser the CLDR field codes that are already supported by existing QDate api. Write new tests.
- Convert unit tests from old api to new api. All existing tests should still pass.
- Convert widgets and other Qt code to new api. All existing tests should still pass.
- Remove old api. All existing tests should still pass.
- Modify QLocale CLDR backend to return full set of values for new api. Write new tests.
- Modify QLocale Mac backend to return full set of values for new api. Write new tests.
- Modify QLocale Windows backend to return full set of values for new api. Write new tests.
- Add QDateTime setLocale() support
- Add Era support
- Add Quarters support
- Add Ordinal Date support
- Add Week Date support
- Add Date Maths support
- Add more Calendar Systems
- Add QDate setCalendarSystem() support
API Changes
Deprecate the old Qt and QDate enums:
// Merges both format and field type!
enum QLocale::FormatType { LongFormat, ShortFormat, NarrowFormat };
// Used for both month and day names!
enum QDate::MonthNameType { DateFormat = 0, StandaloneFormat };
enum Qt::DateFormat { TextDate, // default Qt
ISODate, // ISO 8601
SystemLocaleDate, // deprecated
LocalDate = SystemLocaleDate, // deprecated
LocaleDate, // deprecated
SystemLocaleShortDate,
SystemLocaleLongDate,
DefaultLocaleShortDate,
DefaultLocaleLongDate };
Delete or Deprecate the old QLocale enums:
// Merges both format type and field type!
enum QLocale::FormatType { LongFormat, ShortFormat, NarrowFormat };
Add new QLocale enums:
// CLDR format length attribute for date/time/number/currency
enum QLocale::StringFormat { FullFormat,
LongFormat,
MediumFormat,
ShortFormat };
// CLDR field width attribute
enum QLocale::FieldFormat { LongName, // e.g. January
ShortName, // e.g. Jan
NarrowName, // e.g. J
LongNumber, // e.g. 01
ShortNumber }; // e.g. 1
// CLDR context attribute
enum QLocale::FieldContext { FormatContext, // Use in a format
StandaloneContext }; // Use standalone
// CLDR calendar attribute
enum QLocale::CalendarSystem { DefaultCalendar = 0, // i.e. locale default
GregorianCalendar = 1,
JulianCalendar = 2,
... };
// CLDR year type attribute, in Qt or QDateTime namespace instead?
enum QLocale::YearType { StandardYear, LeapYear }
// CLDR date time fields, maybe in Qt or QLocale namespace?
enum QDateTime::DateTimeField { Year, Month, Day, Hour, Minute, Second, ... }
// Common standard formats, maybe in Qt or QLocale namespace?
enum QDateTime::DateTimeFormat { IsoFormat,
RfcFormat,
Rfc3339Format,
WeekFormat,
OrdinalFormat };
Add new QLocale calendar sytem methods:
CalendarSystem QLocale::calendarSystem(); const // current calendar, usually locale default
QList<CalendarSystem> QLocale::calendarSystems() const; // locale preferred list
QList<CalendarSystem> QLocale::allCalendarSystems() const; // all calendars list
QDateCalculator QLocale::calendar(); // current calendar calculator
Deprecate the old QDate name methods:
static QString QDate::shortMonthName(int month, MonthNameType type = QDate::DateFormat);
static QString QDate::shortDayName(int weekday, MonthNameType type = QDate::DateFormat);
static QString QDate::longMonthName(int month, MonthNameType type = QDate::DateFormat);
static QString QDate::longDayName(int weekday, MonthNameType type = QDate::DateFormat);
Delete or Deprecate the old QLocale name methods:
QString QLocale::monthName(int month, FormatType format = LongFormat) const;
QString QLocale::standaloneMonthName(int month, FormatType format = LongFormat) const;
QString QLocale::dayName(int weekday, FormatType format = LongFormat) const;
QString QLocale::standaloneDayName(int weekday, FormatType format = LongFormat) const;
QString QLocale::amText() const;
QString QLocale::pmText() const;
Add new QLocale name methods:
QString QLocale::monthName(int month,
FieldFormat format = LongName,
FieldContext context = FormatContext,
YearType yearType = StandardYear,
CalendarSystem calendar = DefaultCalendar) const;
QString QLocale::weekdayName(int weekday,
FieldFormat format = LongName,
FieldContext context = FormatContext,
CalendarSystem calendar = DefaultCalendar) const;
QString QLocale::dayPeriodName(QTime time,
FieldFormat format = LongName,
FieldContext context = FormatContext,
CalendarSystem calendar = DefaultCalendar) const;
QString QLocale::eraName(int year,
FieldFormat format = LongName,
FieldContext context = FormatContext,
CalendarSystem calendar = DefaultCalendar) const;
QString QLocale::quarterName(int quarter,
FieldFormat format = LongName,
FieldContext context = FormatContext,
CalendarSystem calendar = DefaultCalendar) const;
QString QLocale::calendarName(CalendarSystem calendar = DefaultCalendar,
FieldFormat format = LongName,
FieldContext context = FormatContext) const;
Modify the QLocale date/time format methods:
QString QLocale::dateFormat(FormatType format = LongFormat) const;
QString QLocale::timeFormat(FormatType format = LongFormat) const;
QString QLocale::dateTimeFormat(FormatType format = LongFormat) const;
to replace FormatType with StringType:
QString QLocale::dateFormat(StringFormat format = LongFormat) const;
QString QLocale::timeFormat(StringFormat format = LongFormat) const;
QString QLocale::dateTimeFormat(StringFormat format = LongFormat) const;
Deprecate all the QDateTime toString() and fromString() methods:
QString QDate::toString(Qt::DateFormat f = Qt::TextDate) const;
QString QDate::toString(const QString &format) const;
static QDate QDate::fromString(const QString &s, Qt::DateFormat f = Qt::TextDate);
static QDate QDate::fromString(const QString &s, const QString &format);
QString QTime::toString(Qt::DateFormat f = Qt::TextDate) const;
QString QTime::toString(const QString &format) const;
static QTime QTime::fromString(const QString &s, Qt::DateFormat f = Qt::TextDate);
static QTime QTime::fromString(const QString &s, const QString &format);
QString QDateTime::toString(Qt::DateFormat f = Qt::TextDate) const;
QString QDateTime::toString(const QString &format) const;
static QDateTime QDateTime::fromString(const QString &s, Qt::DateFormat f = Qt::TextDate);
static QDateTime QDateTime::fromString(const QString &s, const QString &format);
Mondify the QLocale toString() and fromString() methods:
QString QLocale::toString(const QDate &date, FormatType format = LongFormat) const;
QString QLocale::toString(const QTime &time, FormatType format = LongFormat) const;
QString QLocale::toString(const QDateTime &dateTime, FormatType format = LongFormat) const;
QDate QLocale::toDate(const QString &string, FormatType = LongFormat) const;
QTime QLocale::toTime(const QString &string, FormatType = LongFormat) const;
QDateTime QLocale::toDateTime(const QString &string, FormatType format = LongFormat) const;
to replace FormatType with StringType:
QString QLocale::toString(const QDate &date, StringType format = LongFormat) const;
QString QLocale::toString(const QTime &time, StringType format = LongFormat) const;
QString QLocale::toString(const QDateTime &dateTime, StringType format = LongFormat) const;
QDate QLocale::toDate(const QString &string, StringType = LongFormat) const;
QTime QLocale::toTime(const QString &string, StringType = LongFormat) const;
QDateTime QLocale::toDateTime(const QString &string, StringType format = LongFormat) const;
Add the following new toString/fromSting methods to QLocale
QString QLocale::toString(const QDate &date, QDateTime::DateTimeFormat format) const;
QString QLocale::toString(const QTime &time, QDateTime::DateTimeFormat format) const;
QString QLocale::toString(const QDateTime &dateTime, QDateTime::DateTimeFormat format) const;
QDate QLocale::toDate(const QString &string, QDateTime::DateTimeFormat format) const;
QTime QLocale::toTime(const QString &string, QDateTime::DateTimeFormat format) const;
QDateTime QLocale::toDateTime(const QString &string, QDateTime::DateTimeFormat format) const;
Modify the existing string date field format codes to be CLDR compliant as follows:
ddd - Weekday - Change to EEE
dddd - Weekday - Change to EEEE
AP - AM/PM - Remove, already have A
ap - am/pm - Remove, already have a
h - Hour - Modify behaviour to match CLDR
hh - Hour - Modify behaviour to match CLDR
t - Timezone - Change to z
Add new CLDR date field format codes for existing or new api:
ddddd - Weekday narrow name
MMMMM - Month narrow name
y - Year without leading zeros
d - Day of Year
w - Week of Year
Y - Week Year
L - Stand-alone Month
e - Weekday
E - Weekday
c - Stand-alone Weekday
G - Era name
z - Timezone
Z - Timezone
v - Timezone
V - Timezone
Q - Quarter of Year
q - Stand-alone Quarter of Year
W - Week of Month
F - Day of Week In Month