Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qcalendar.h
Go to the documentation of this file.
1// Copyright (C) 2021 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3// Qt-Security score:significant reason:default
4
5#ifndef QCALENDAR_H
6#define QCALENDAR_H
7
8#include <limits>
9
10#include <QtCore/qglobal.h>
11#include <QtCore/qlocale.h>
12#include <QtCore/qstring.h>
13#include <QtCore/qstringview.h>
14
15/* Suggested enum names for other calendars known to CLDR (v33.1)
16
17 Not yet implemented - see QCalendar::System - contributions welcome:
18
19 * Buddhist -- Thai Buddhist, to be specific
20 * Chinese
21 * Coptic
22 * Dangi -- Korean
23 * Ethiopic (Amete Mihret - epoch approx. 8 C.E.)
24 * EthiopicAmeteAlem (Amete Alem - epoch approx. 5493 B.C.E; data from
25 type="ethiopic-amete-alem", an alias for type="ethioaa")
26 * Hebrew
27 * Indian -- National
28 * Islamic -- Based on astronomical observations, not predictions, so hard to
29 implement. CLDR's data for type="islamic" apply, unless overridden, to the
30 other Islamic calendar variants, i.e. IslamicCivil, above, and the three
31 following. See QHijriCalendar, a common base to provide that data.
32 * IslamicTabular -- tabular, astronomical epoch (same as IslamicCivil, except
33 for epoch), CLDR type="islamic-tbla"
34 * Saudi -- Saudi Arabia, sighting; CLDR type="islamic-rgsa"
35 * UmmAlQura -- Umm al-Qura, Saudi Arabia, calculated; CLDR type="islamic-umalqura"
36 * Iso8601 -- as Gregorian, but treating ISO 8601 weeks as "months"
37 * Japanese -- Imperial calendar
38 * Minguo -- Republic of China, Taiwan; CLDR type="roc"
39
40 See:
41 http://www.unicode.org/repos/cldr/tags/latest/common/bcp47/calendar.xml
42
43 These can potentially be supported, as features, using CLDR's data; any
44 others shall need hand-crafted localization data; it would probably be best
45 to do that by contributing data for them to CLDR.
46*/
47
48QT_BEGIN_NAMESPACE
49
50class QCalendarBackend;
51class QDate;
52
53class Q_CORE_EXPORT QCalendar
54{
55 Q_GADGET
56public:
57 // (Extra parentheses to suppress bogus reading of min() as a macro.)
58 enum : int { Unspecified = (std::numeric_limits<int>::min)() };
59 struct YearMonthDay
60 {
61 YearMonthDay() = default;
62 YearMonthDay(int y, int m = 1, int d = 1) : year(y), month(m), day(d) {}
63
64 bool isValid() const
65 { return month != Unspecified && day != Unspecified; }
66 // (The first year supported by QDate has year == Unspecified.)
67
68 int year = Unspecified;
69 int month = Unspecified;
70 int day = Unspecified;
71 };
72 // Feature (\w+)calendar uses CLDR type="\1" data, except as noted in type="..." comments below
73 enum class System
74 {
75 Gregorian, // CLDR: type = "gregory", alias = "gregorian"
76#ifndef QT_BOOTSTRAPPED
77 Julian = 8,
78 Milankovic = 9,
79#endif // These are Roman-based, so share Gregorian's CLDR data
80
81 // Feature-controlled calendars:
82#if QT_CONFIG(jalalicalendar) // type="persian"
83 Jalali = 10,
84#endif
85#if QT_CONFIG(islamiccivilcalendar) // type="islamic-civil", uses data from type="islamic"
86 IslamicCivil = 11,
87 // tabular, civil epoch
88 // 30 year cycle, leap on 2, 5, 7, 10, 13, 16, 18, 21, 24, 26 and 29
89 // (Other variants: 2, 5, 8, (10|11), 13, 16, 19, 21, 24, 27 and 29.)
90#endif
91
92 Last = 11, // Highest number of any above
93 User = -1
94 };
95 // New entries must be added to the \enum doc in qcalendar.cpp and
96 // handled in QCalendarBackend::fromEnum()
97 Q_ENUM(System)
98 class SystemId
99 {
100 size_t id;
101 friend class QCalendarBackend;
102 constexpr bool isInEnum() const { return id <= size_t(QCalendar::System::Last); }
103 constexpr explicit SystemId(QCalendar::System e) : id(size_t(e)) { }
104 constexpr explicit SystemId(size_t i) : id(i) { }
105
106 public:
107 constexpr SystemId() : id(~size_t(0)) {}
108 constexpr size_t index() const noexcept { return id; }
109 constexpr bool isValid() const noexcept { return ~id; }
110 };
111
112 explicit QCalendar(); // Gregorian, optimised
113 explicit QCalendar(System system);
114#if QT_CORE_REMOVED_SINCE(6, 4)
115 explicit QCalendar(QLatin1StringView name);
116 explicit QCalendar(QStringView name);
117#endif
118 explicit QCalendar(QAnyStringView name);
119 explicit QCalendar(SystemId id);
120
121 // QCalendar is a trivially copyable value type.
122 bool isValid() const { return d_ptr != nullptr; }
123
124 // Date queries:
125 int daysInMonth(int month, int year = Unspecified) const;
126 int daysInYear(int year) const;
127 int monthsInYear(int year) const;
128 bool isDateValid(int year, int month, int day) const;
129
130 // Leap years:
131 bool isLeapYear(int year) const;
132
133 // Properties of the calendar:
134 bool isGregorian() const;
135 bool isLunar() const;
136 bool isLuniSolar() const;
137 bool isSolar() const;
138 bool isProleptic() const;
139 bool hasYearZero() const;
140 int maximumDaysInMonth() const;
141 int minimumDaysInMonth() const;
142 int maximumMonthsInYear() const;
143 QString name() const;
144
145 // QDate conversions:
146 QDate dateFromParts(int year, int month, int day) const;
147 QDate dateFromParts(const YearMonthDay &parts) const;
148 QDate matchCenturyToWeekday(const YearMonthDay &parts, int dow) const;
149 YearMonthDay partsFromDate(QDate date) const;
150 int dayOfWeek(QDate date) const;
151
152 // Month and week-day names (as in QLocale):
153 QString monthName(const QLocale &locale, int month, int year = Unspecified,
154 QLocale::FormatType format=QLocale::LongFormat) const;
155 QString standaloneMonthName(const QLocale &locale, int month, int year = Unspecified,
156 QLocale::FormatType format = QLocale::LongFormat) const;
157 QString weekDayName(const QLocale &locale, int day,
158 QLocale::FormatType format = QLocale::LongFormat) const;
159 QString standaloneWeekDayName(const QLocale &locale, int day,
160 QLocale::FormatType format=QLocale::LongFormat) const;
161
162 // Formatting of date-times:
163 QString dateTimeToString(QStringView format, const QDateTime &datetime,
164 QDate dateOnly, QTime timeOnly,
165 const QLocale &locale) const;
166
167 // What's available ?
168 static QStringList availableCalendars();
169private:
170 // Always supplied by QCalendarBackend and expected to be a singleton
171 // Note that the calendar registry destroys all backends when it is itself
172 // destroyed. The code should check if the registry is destroyed before
173 // dereferencing this pointer.
174 const QCalendarBackend *d_ptr;
175};
176
177QT_END_NAMESPACE
178
179#endif // QCALENDAR_H
The QCalendar class describes calendar systems.
Definition qcalendar.h:54
const QLocaleData *const m_data
Definition qlocale_p.h:619
QLocale::MeasurementSystem measurementSystem() const
Definition qlocale.cpp:3550
QByteArray bcp47Name(char separator='-') const
Definition qlocale.cpp:495
char32_t next(char32_t invalidAs=QChar::ReplacementCharacter)
bool hasNext() const
Combined button and popup list for selecting options.
Definition qcompare.h:111
CaseSensitivity
@ CaseInsensitive
@ CaseSensitive
Q_GLOBAL_STATIC(DefaultRoleNames, qDefaultRoleNames, { { Qt::DisplayRole, "display" }, { Qt::DecorationRole, "decoration" }, { Qt::EditRole, "edit" }, { Qt::ToolTipRole, "toolTip" }, { Qt::StatusTipRole, "statusTip" }, { Qt::WhatsThisRole, "whatsThis" }, }) const QHash< int
static unsigned calculateFlags(int fieldWidth, char32_t fillChar, const QLocale &locale)
Definition qlocale.cpp:2237
static QString calculateFiller(qsizetype padding, char32_t fillChar, qsizetype fieldWidth, const QLocaleData *localeData)
Definition qlocale.cpp:2251
QDebug operator<<(QDebug dbg, const QLocale &l)
Definition qlocale.cpp:5541
static QLocalePrivate * findLocalePrivate(QLocale::Language language, QLocale::Script script, QLocale::Territory territory)
Definition qlocale.cpp:1002
static std::optional< QString > systemLocaleString(const QLocaleData *that, QSystemLocale::QueryType type)
Definition qlocale.cpp:1049
static const QSystemLocale * systemLocale()
Definition qlocale.cpp:857
static bool checkParsed(QByteArrayView num, qsizetype used)
Definition qlocale.cpp:4946
static QString rawWeekDayName(const QLocaleData *data, const int day, QLocale::FormatType type)
Definition qlocale.cpp:3352
QDataStream & operator>>(QDataStream &ds, QLocale &l)
Definition qlocale.cpp:980
#define CheckCandidate(id)
static Q_DECL_COLD_FUNCTION void badSeparatorWarning(const char *method, char sep)
Definition qlocale.cpp:1538
static QString rawStandaloneWeekDayName(const QLocaleData *data, const int day, QLocale::FormatType type)
Definition qlocale.cpp:3376
static constexpr QLocale::NumberOptions defaultNumberOptions(QLocale::Language forLanguage)
Definition qlocale.cpp:796
static QStringView findTag(QStringView name) noexcept
Definition qlocale.cpp:643
static bool validTag(QStringView tag)
Definition qlocale.cpp:652
static qsizetype scriptIndex(QStringView code, Qt::CaseSensitivity cs) noexcept
Definition qlocale.cpp:184
static const QCalendarLocale & getMonthDataFor(const QLocalePrivate *loc, const QCalendarLocale *table)
Definition qlocale.cpp:3299
static T toIntegral_helper(const QLocalePrivate *d, QStringView str, bool *ok)
Definition qlocale.cpp:1586
static bool timeFormatContainsAP(QStringView format)
Definition qlocale.cpp:2458
size_t qHash(const QLocale &key, size_t seed) noexcept
Definition qlocale.cpp:1319
bool comparesEqual(const QLocale &loc, QLocale::Language lang)
Definition qlocale.cpp:1023
static qsizetype findLocaleIndexById(QLocaleId localeId) noexcept
Definition qlocale.cpp:505
static constexpr qsizetype locale_data_size
Definition qlocale.cpp:524
static void updateSystemPrivate()
Definition qlocale.cpp:869
static QString rawMonthName(const QCalendarLocale &localeData, const char16_t *monthsData, int month, QLocale::FormatType type)
Definition qlocale.cpp:3326
static qsizetype stringWidth(QStringView text)
Definition qlocale.cpp:2226
static QLocalePrivate * c_private() noexcept
Definition qlocale.cpp:790
static const QLocaleData * defaultData()
Definition qlocale.cpp:944
static QString rawStandaloneMonthName(const QCalendarLocale &localeData, const char16_t *monthsData, int month, QLocale::FormatType type)
Definition qlocale.cpp:3338
static QString localeString(const QLocaleData *that, QSystemLocale::QueryType type, QLocaleData::DataRange range)
Definition qlocale.cpp:1067
static const QLocaleData * systemData(qsizetype *sysIndex=nullptr)
Definition qlocale.cpp:904
static QString offsetFromAbbreviation(QString &&text)
Definition qlocale.cpp:3761
static qsizetype defaultIndex()
Definition qlocale.cpp:951
static constexpr char16_t single_character_data[]
static constexpr char16_t days_data[]
static constexpr QLocaleData locale_data[]
static constexpr QLocaleId likely_subtags[]
static constexpr unsigned char territory_code_list[]
static constexpr unsigned char script_code_list[]
bool qt_splitLocaleName(QStringView name, QStringView *lang=nullptr, QStringView *script=nullptr, QStringView *cntry=nullptr) noexcept
Definition qlocale.cpp:663
qsizetype qt_repeatCount(QStringView s) noexcept
Definition qlocale.cpp:776
QString qt_readEscapedFormatString(QStringView format, qsizetype *idx)
Definition qlocale.cpp:726
#define QStringLiteral(str)
Definition qstring.h:1825
char32_t ucsFirst(const char16_t *table) const
Definition qlocale_p.h:493
const GroupSizes grouping
Definition qlocale_p.h:371
QString positiveSign() const
Definition qlocale.cpp:1121
QString groupSeparator() const
Definition qlocale.cpp:1080
QSimpleParsedNumber< qint64 > stringToLongLong(QStringView str, int base, QLocale::NumberOptions options) const
Definition qlocale.cpp:4925
Q_AUTOTEST_EXPORT char32_t zeroUcs() const
Definition qlocale.cpp:1100
QString zeroDigit() const
Definition qlocale.cpp:1095
bool numberToCLocale(QStringView s, QLocale::NumberOptions number_options, NumberMode mode, CharBuff *result) const
Definition qlocale.cpp:4651
QString decimalPoint() const
Definition qlocale.cpp:1075
QString doubleToString(double d, int precision=-1, DoubleForm form=DFSignificantDigits, int width=-1, unsigned flags=NoFlags) const
Definition qlocale.cpp:4079
QLocaleId id() const
Definition qlocale_p.h:456
QString listSeparator() const
Definition qlocale.cpp:1090
QString percentSign() const
Definition qlocale.cpp:1085
@ AddTrailingZeroes
Definition qlocale_p.h:267
double stringToDouble(QStringView str, bool *ok, QLocale::NumberOptions options) const
Definition qlocale.cpp:4909
QString longLongToString(qint64 l, int precision=-1, int base=10, int width=-1, unsigned flags=NoFlags) const
Definition qlocale.cpp:4322
@ DoubleScientificMode
Definition qlocale_p.h:281
@ DFSignificantDigits
Definition qlocale_p.h:261
QString exponentSeparator() const
Definition qlocale.cpp:1126
QString negativeSign() const
Definition qlocale.cpp:1116
QSimpleParsedNumber< quint64 > stringToUnsLongLong(QStringView str, int base, QLocale::NumberOptions options) const
Definition qlocale.cpp:4936
QString unsLongLongToString(quint64 l, int precision=-1, int base=10, int width=-1, unsigned flags=NoFlags) const
Definition qlocale.cpp:4337
QLocaleId withLikelySubtagsAdded() const noexcept
Definition qlocale.cpp:327
QLocaleId withLikelySubtagsRemoved() const noexcept
Definition qlocale.cpp:416
ushort script_id
Definition qlocale_p.h:242
bool operator==(QLocaleId other) const noexcept
Definition qlocale_p.h:211
ushort territory_id
Definition qlocale_p.h:242
ushort language_id
Definition qlocale_p.h:242