yangyin
2025-01-13 36616eb44dc36a4e6e3e7a7540310cb850218ea9
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
// THIS FILE IS PART OF ChineseCalendar PROJECT
// THE ChineseCalendar PROJECT IS AN OPENSOURCE LIBRARY LICENSED UNDER THE MIT License.
// COPYRIGHT (C) lpz. ALL RIGHTS RESERVED.
// GITEE: https://gitee.com/lipz89/ChineseCalendar
 
using System;
using System.Collections.Generic;
 
namespace ChineseCalendar
{
    /// <summary>
    /// 公历节假日
    /// </summary>
    public class GregorianFestival : LoopFestival
    {
        private GregorianFestival() { }
        /// <summary> 节日的第一个日期 </summary>
        public DateTime? First { get; protected set; }
 
        private static readonly Dictionary<int, int> monthDays = new Dictionary<int, int> {
            { 1,31},{ 2,29},{ 3,31},{ 4,30},{ 5,31},{ 6,30},{ 7,31},{ 8,31},{ 9,30},{ 10,31},{ 11,30},{ 12,31},
        };
        /// <summary>
        /// 定义一个公历节日
        /// </summary>
        /// <param name="name">节日名称</param>
        /// <param name="month">月份</param>
        /// <param name="day">日期</param>
        /// <param name="firstYear">第一个节日的年份,0表示无永恒</param>
        /// <param name="description">节日描述</param>
        /// <exception cref="ArgumentNullException">没有名称</exception>
        /// <exception cref="ArgumentOutOfRangeException">日期超出范围</exception>
        public GregorianFestival(string name, int month, int day, int firstYear = 0, string description = null)
        {
            if (string.IsNullOrWhiteSpace(name))
            {
                throw new ArgumentNullException(nameof(name));
            }
            if (month < 1 || month > 12)
            {
                throw new ArgumentOutOfRangeException(nameof(month), "[1,12]", "月份超出范围");
            }
            var maxDays = monthDays[month];
            if (day < 1 || day > maxDays)
            {
                throw new ArgumentOutOfRangeException(nameof(day), $"[1,{maxDays}]", "日期超出范围");
            }
 
            this.Name = name;
            this.Month = month;
            this.Day = day;
            this.FirstYear = firstYear;
            this.Description = description;
            if (this.FirstYear.HasValue)
            {
                this.First = new DateTime(firstYear, month, day);
            }
        }
        /// <summary> 元旦 </summary>
        public static readonly GregorianFestival NewYearsDay = new GregorianFestival
        {
            Name = "元旦",
            Description = "1月1日",
            Month = 1,
            Day = 1,
        };
        /// <summary> 植树节 </summary>
        public static readonly GregorianFestival ArborDay = new GregorianFestival
        {
            Name = "植树节",
            Description = "3月12日",
            Month = 3,
            Day = 12,
            FirstYear = 1979
        };
        /// <summary> 清明 </summary>
        public static readonly GregorianFestival TheTombWeepingDay = new GregorianFestival
        {
            Name = "清明",
            Description = "4月5日",
            Month = 4,
            Day = 5,
        };
        /// <summary> 劳动节 </summary>
        public static readonly GregorianFestival InternationalWorkersDay = new GregorianFestival
        {
            Name = "劳动节",
            Description = "5月1日",
            Month = 5,
            Day = 1,
            FirstYear = 1890
        };
        /// <summary> 国庆节 </summary>
        public static readonly GregorianFestival TheNationalDay = new GregorianFestival
        {
            Name = "国庆节",
            Description = "10月1日",
            Month = 10,
            Day = 1,
            FirstYear = 1949
        };
 
        /// <inheritdoc/>
        public override bool IsThisFestival(DateTime date)
        {
            return date.Month == this.Month && date.Day == this.Day;
        }
    }
}