summaryrefslogtreecommitdiffstats
path: root/src/corelib/time/qcalendar.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib/time/qcalendar.h')
-rw-r--r--src/corelib/time/qcalendar.h193
1 files changed, 193 insertions, 0 deletions
diff --git a/src/corelib/time/qcalendar.h b/src/corelib/time/qcalendar.h
new file mode 100644
index 0000000000..42c8e150c5
--- /dev/null
+++ b/src/corelib/time/qcalendar.h
@@ -0,0 +1,193 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QCALENDAR_H
+#define QCALENDAR_H
+
+#include <limits>
+
+#include <QtCore/qglobal.h>
+#include <QtCore/qlocale.h>
+#include <QtCore/qstring.h>
+#include <QtCore/qstringview.h>
+
+/* Suggested enum names for other calendars known to CLDR (v33.1)
+
+ Not yet implemented - see QCalendar::System - contributions welcome:
+
+ * Buddhist -- Thai Buddhist, to be specific
+ * Chinese
+ * Coptic
+ * Dangi -- Korean
+ * Ethiopic (Amete Mihret - epoch approx. 8 C.E.)
+ * EthiopicAmeteAlem (Amete Alem - epoch approx. 5493 B.C.E; data from
+ type="ethiopic-amete-alem", an alias for type="ethioaa")
+ * Hebrew
+ * Indian -- National
+ * Islamic -- Based on astronomical observations, not predictions, so hard to
+ implement. CLDR's data for type="islamic" apply, unless overridden, to the
+ other Islamic calendar variants, i.e. IslamicCivil, above, and the three
+ following. See QHijriCalendar, a common base to provide that data.
+ * IslamicTabular -- tabular, astronomical epoch (same as IslamicCivil, except
+ for epoch), CLDR type="islamic-tbla"
+ * Saudi -- Saudi Arabia, sighting; CLDR type="islamic-rgsa"
+ * UmmAlQura -- Umm al-Qura, Saudi Arabia, calculated; CLDR type="islamic-umalqura"
+ * Iso8601 -- as Gregorian, but treating ISO 8601 weeks as "months"
+ * Japanese -- Imperial calendar
+ * Minguo -- Republic of China, Taiwan; CLDR type="roc"
+
+ See:
+ http://www.unicode.org/repos/cldr/tags/latest/common/bcp47/calendar.xml
+
+ These can potentially be supported, as features, using CLDR's data; any
+ others shall need hand-crafted localization data; it would probably be best
+ to do that by contributing data for them to CLDR.
+*/
+
+QT_BEGIN_NAMESPACE
+
+class QCalendarBackend;
+class QDate;
+
+class Q_CORE_EXPORT QCalendar
+{
+ Q_GADGET
+public:
+ // (Extra parentheses to suppress bogus reading of min() as a macro.)
+ enum : int { Unspecified = (std::numeric_limits<int>::min)() };
+ struct YearMonthDay
+ {
+ YearMonthDay() = default;
+ YearMonthDay(int y, int m = 1, int d = 1) : year(y), month(m), day(d) {}
+
+ bool isValid() const
+ { return month != Unspecified && day != Unspecified; }
+ // (The first year supported by QDate has year == Unspecified.)
+
+ int year = Unspecified;
+ int month = Unspecified;
+ int day = Unspecified;
+ };
+ // Feature (\w+)calendar uses CLDR type="\1" data, except as noted in type="..." comments below
+ enum class System
+ {
+ Gregorian, // CLDR: type = "gregory", alias = "gregorian"
+#ifndef QT_BOOTSTRAPPED
+ Julian = 8,
+ Milankovic = 9,
+#endif // These are Roman-based, so share Gregorian's CLDR data
+
+ // Feature-controlled calendars:
+#if QT_CONFIG(jalalicalendar) // type="persian"
+ Jalali = 10,
+#endif
+#if QT_CONFIG(islamiccivilcalendar) // type="islamic-civil", uses data from type="islamic"
+ IslamicCivil = 11,
+ // tabular, civil epoch
+ // 30 year cycle, leap on 2, 5, 7, 10, 13, 16, 18, 21, 24, 26 and 29
+ // (Other variants: 2, 5, 8, (10|11), 13, 16, 19, 21, 24, 27 and 29.)
+#endif
+
+ Last = 11, // Highest number of any above
+ User = -1
+ };
+ // New entries must be added to the \enum doc in qcalendar.cpp and
+ // handled in QCalendarBackend::fromEnum()
+ Q_ENUM(System)
+
+ explicit QCalendar(); // Gregorian, optimised
+ explicit QCalendar(System system);
+ explicit QCalendar(QLatin1String name);
+ explicit QCalendar(QStringView name);
+
+ // QCalendar is a trivially copyable value type.
+ bool isValid() const { return d != nullptr; }
+
+ // Date queries:
+ int daysInMonth(int month, int year = Unspecified) const;
+ int daysInYear(int year) const;
+ int monthsInYear(int year) const;
+ bool isDateValid(int year, int month, int day) const;
+
+ // Leap years:
+ bool isLeapYear(int year) const;
+
+ // Properties of the calendar:
+ bool isGregorian() const;
+ bool isLunar() const;
+ bool isLuniSolar() const;
+ bool isSolar() const;
+ bool isProleptic() const;
+ bool hasYearZero() const;
+ int maximumDaysInMonth() const;
+ int minimumDaysInMonth() const;
+ int maximumMonthsInYear() const;
+ QString name() const;
+
+ // QDate conversions:
+ QDate dateFromParts(int year, int month, int day) const;
+ QDate dateFromParts(const YearMonthDay &parts) const;
+ YearMonthDay partsFromDate(QDate date) const;
+ int dayOfWeek(QDate date) const;
+
+ // Month and week-day names (as in QLocale):
+ QString monthName(const QLocale &locale, int month, int year = Unspecified,
+ QLocale::FormatType format=QLocale::LongFormat) const;
+ QString standaloneMonthName(const QLocale &locale, int month, int year = Unspecified,
+ QLocale::FormatType format = QLocale::LongFormat) const;
+ QString weekDayName(const QLocale &locale, int day,
+ QLocale::FormatType format = QLocale::LongFormat) const;
+ QString standaloneWeekDayName(const QLocale &locale, int day,
+ QLocale::FormatType format=QLocale::LongFormat) const;
+
+ // Formatting of date-times:
+ QString dateTimeToString(QStringView format, const QDateTime &datetime,
+ const QDate &dateOnly, const QTime &timeOnly,
+ const QLocale &locale) const;
+
+ // What's available ?
+ static QStringList availableCalendars();
+private:
+ // Always supplied by QCalendarBackend and expected to be a singleton
+ const QCalendarBackend *d;
+};
+
+QT_END_NAMESPACE
+
+#endif // QCALENDAR_H