QT6 源(82):阅读与注释日历类型 QCalendar,本类并未完结,儒略历,格里高利历原来就是公历,

(1)本代码来自于头文件 qcalendar . h

cpp 复制代码
#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;

/*
The QCalendar class describes calendar systems.

QCalendar对象使用特定系统的规则将年、月和日数映射到特定的日期(最终由其儒略日数标识).

默认的 QCalendar()是一个推算的格里高利历,没有零年。
通过启用合适的功能或加载插件,可以支持其他日历。
作为功能支持的日历可以通过将QCalendar:System 枚举传递给构造函数来构建。
所有支持过的日历在构建后都可以通过名称来构建。
(因此插件会实例化它们的日历后端以进行注册。)

通过 QCalendar::System 可访问的内置后端也总是可以通过名称获取。
 使用自定义后端的时间表也可以在构建时使用分配给后端的-个唯-ID来构建。

QCalendar值是不可变的。
*/

class Q_CORE_EXPORT QCalendar
{
    Q_GADGET

private:
    // 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 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

// 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.)
#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) //接入 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, optimised

    explicit QCalendar(System system);

    // ### Qt 7: remove
    explicit QCalendar(QLatin1String name);

    // ### Qt 7: use QAnyStringView
    explicit 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 QCalendar

QT_END_NAMESPACE

#endif // QCALENDAR_H

(2)儒略历,格里高利历原来就是公历



(3)现代公历



(4)

谢谢

相关推荐
用户805533698033 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner3 天前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz8 天前
QML Hello World 入门示例
qt
xcyxiner11 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner11 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner12 天前
DicomViewer (添加模型类)3
qt
xcyxiner13 天前
DicomViewer (目录调整) 2
qt
xcyxiner13 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
桥田智能15 天前
桥田智能 QT-650S:面向白车身焊装的 800kg 重载快换解决方案
开发语言·qt·系统架构
森G15 天前
75、服务器源码解析---------云视频服务项目
linux·服务器·网络·c++·qt