(1)本代码来自于头文件 qcalendar . h :
#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 fromtype="ethiopic-amete-alem", an alias for type="ethioaa")* Hebrew* Indian -- National* Islamic -- Based on astronomical observations, not predictions, so hard toimplement. CLDR's data for type="islamic" apply, unless overridden, to theother Islamic calendar variants, i.e. IslamicCivil, above, and the threefollowing. See QHijriCalendar, a common base to provide that data.* IslamicTabular -- tabular, astronomical epoch (same as IslamicCivil, exceptfor 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.xmlThese can potentially be supported, as features, using CLDR's data; anyothers shall need hand-crafted localization data; it would probably be bestto do that by contributing data for them to CLDR.
*/QT_BEGIN_NAMESPACEclass QCalendarBackend;
class QDate;/*
The QCalendar class describes calendar systems.QCalendar对象使用特定系统的规则将年、月和日数映射到特定的日期(最终由其儒略日数标识).默认的 QCalendar()是一个推算的格里高利历,没有零年。
通过启用合适的功能或加载插件,可以支持其他日历。
作为功能支持的日历可以通过将QCalendar:System 枚举传递给构造函数来构建。
所有支持过的日历在构建后都可以通过名称来构建。
(因此插件会实例化它们的日历后端以进行注册。)通过 QCalendar::System 可访问的内置后端也总是可以通过名称获取。使用自定义后端的时间表也可以在构建时使用分配给后端的-个唯-ID来构建。QCalendar值是不可变的。
*/class Q_CORE_EXPORT QCalendar
{Q_GADGETprivate:// Always supplied by QCalendarBackend and expected to be a singleton// Note that the calendar registry destroys all backends when it is itself// destroyed. The code should check if the registry is destroyed before// dereferencing this pointer.const QCalendarBackend * d_ptr;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 belowenum class System{Gregorian, // CLDR: type = "gregory", alias = "gregorian"#ifndef QT_BOOTSTRAPPEDJulian = 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// type="islamic-civil", uses data from type="islamic"
#if QT_CONFIG(islamiccivilcalendar)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.)
#endifLast = 11, // Highest number of any aboveUser = -1};// New entries must be added to the \enum doc in qcalendar.cpp and// handled in QCalendarBackend::fromEnum()Q_ENUM(System) //接入 Qt 的元对象系统class SystemId{size_t id;friend class QCalendarBackend;constexpr bool isInEnum() const{ return id <= size_t(QCalendar::System::Last); }constexpr explicit SystemId(QCalendar::System e) : id(size_t(e)) { }constexpr explicit SystemId(size_t i) : id(i) { }public:constexpr SystemId() : id(~size_t(0)) {}constexpr size_t index() const noexcept { return id; }constexpr bool isValid() const noexcept { return ~id; }};explicit QCalendar(); // Gregorian, optimisedexplicit QCalendar(System system);// ### Qt 7: removeexplicit QCalendar(QLatin1String name);// ### Qt 7: use QAnyStringViewexplicit QCalendar(QStringView name);explicit QCalendar(SystemId id);// QCalendar is a trivially copyable value type.bool isValid() const { return d_ptr != 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,QDate dateOnly, QTime timeOnly,const QLocale & locale) const;// What's available ?static QStringList availableCalendars();}; //完结 class Q_CORE_EXPORT QCalendarQT_END_NAMESPACE#endif // QCALENDAR_H
(2)儒略历,格里高利历原来就是公历 :
(3)现代公历 :
(4)
谢谢