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)

谢谢

相关推荐
机器视觉知识推荐、就业指导24 分钟前
Qt开发经验:回调函数的线程归属问题及回调函数中更新控件的问题
开发语言·qt
星火撩猿3 小时前
OpenGl实战笔记(3)基于qt5.15.2+mingw64+opengl实现光照变化效果
笔记·qt·opengl·光照效果
若水晴空初如梦3 小时前
QT聊天项目DAY09
开发语言·qt·bootstrap
yxc_inspire5 小时前
基于Qt的app开发第六天
开发语言·c++·qt
星火撩猿8 小时前
OpenGl实战笔记(2)基于qt5.15.2+mingw64+opengl实现纹理贴图
笔记·qt·opengl·纹理贴图
懒惰的bit8 小时前
QT人工智能篇-opencv
人工智能·qt·opencv
沐雨潇竹13 小时前
Qt 中信号与槽(signal-slot)机制支持 多种连接方式(ConnectionType)
开发语言·qt
mozun202013 小时前
QT:qt5调用打开exe程序并获取调用按钮控件实例2025.5.7
开发语言·数据库·qt·测试用例·控件·外部调用
hongyanwin20 小时前
cmake qt 项目编译(win)
开发语言·qt