コード例 #1
0
ファイル: ClassHoliday.cs プロジェクト: tokusan1015/SBMethod
 /// <summary>
 /// 休日を追加する
 /// </summary>
 /// <param name="hi">休日情報</param>
 public void AddHolidayInfo(
     HolidayInfo hi
     )
 {
     this._HolidayInfo.Add(
         item: hi
         );
 }
コード例 #2
0
ファイル: ClassHoliday.cs プロジェクト: tokusan1015/SBMethod
        /// <summary>
        /// 全ての国民の休日を求める
        /// </summary>
        /// <param name="sdHolidays"></param>
        /// <returns>結果</returns>
        private IEnumerable <HolidayInfo> GetSandwichedHolidays(
            SortedDictionary <DateTime, HolidayInfo> sdHolidays
            )
        {
            var sandwichedHolidays = new List <HolidayInfo>();

            // これまでに求めた祝日を全部チェックする
            foreach (var holiday0 in sdHolidays.Values)
            {
                if (holiday0._HolidayKind != HolidayInfo.enmHolidayKind.国民の祝日)
                {
                    continue; // その休日が国民の祝日でなければ除外する
                }
                var day0 = holiday0._Date;

                var day2 = day0.AddDays(value: 2.0); // 2日後
                if (!sdHolidays.ContainsKey(key: day2))
                {
                    continue; // 2日後が祝日でないときは除外する
                }
                var holiday2 = sdHolidays[day2];
                if (holiday2._HolidayKind != HolidayInfo.enmHolidayKind.国民の祝日)
                {
                    continue;                 // 2日後が祝日であっても国民の祝日でなければ除外する
                }
                var day1 = day0.AddDays(1.0); // 1日後=国民の祝日で挟まれた日
                if (day1.DayOfWeek == DayOfWeek.Sunday)
                {
                    continue; // その日が日曜(=もともと休日)のときは除外する
                }
                if (sdHolidays.ContainsKey(key: day1))
                {
                    continue; // その日がすでに祝日のときは除外する
                }
                // 見つかった国民の休日をコレクションに追加する
                var sandwichedHoliday = new HolidayInfo(
                    )
                {
                    _Date           = day1,
                    _HolidayKind    = HolidayInfo.enmHolidayKind.国民の休日,
                    _Name           = HolidayInfo.enmHolidayKind.国民の休日.ToString(),
                    _Param          = 0,
                    _StartApplyYear = 1985,
                    _EndApplyYear   = MAX_YEAR,
                    _Definition     = string.Format(
                        format: "{0}と{1}の間の日",
                        args: new object[]
                    {
                        holiday0._Name,
                        holiday2._Name
                    }),
                };
                sandwichedHolidays.Add(item: sandwichedHoliday);
            }
            return(sandwichedHolidays);
        }
コード例 #3
0
ファイル: ClassHoliday.cs プロジェクト: tokusan1015/SBMethod
        /// <summary>
        /// 振替休日を求める
        /// </summary>
        /// <param name="sdHolidays"></param>
        /// <returns></returns>
        private IEnumerable <HolidayInfo> GetSubstituteHolidays(
            SortedDictionary <DateTime, HolidayInfo> sdHolidays
            )
        {
            // 振替休日を格納するためのコレクション
            var substituteHolidays = new List <HolidayInfo>();

            // これまでに求めた祝日を全部チェックする
            foreach (var holiday in sdHolidays.Values)
            {
                if (holiday._Date.DayOfWeek != DayOfWeek.Sunday)
                {
                    continue; // 日曜でなければ除外する
                }
                // 翌日(=月曜日)を仮に振替休日とする
                DateTime substitute = holiday._Date.AddDays(value: 1.0);

                // その日がすでに祝日ならば振替休日はさらにその翌日
                while (sdHolidays.ContainsKey(key: substitute))
                {
                    substitute = substitute.AddDays(value: 1.0);
                }

                // 見つかった振替休日をコレクションに追加する
                var substituteHoliday = new HolidayInfo()
                {
                    _Date           = substitute,
                    _HolidayKind    = HolidayInfo.enmHolidayKind.振替休日,
                    _Param          = 0,
                    _StartApplyYear = 1973,
                    _EndApplyYear   = MAX_YEAR,
                    _Name           = HolidayInfo.enmHolidayKind.振替休日.ToString(),
                    _Definition     =
                        string.Format(
                            format: "{0}の{1}",
                            args: new object[]
                    {
                        holiday._Name,
                        HolidayInfo.enmHolidayKind.振替休日.ToString()
                    })
                };
                substituteHolidays.Add(item: substituteHoliday);
            }
            return(substituteHolidays);
        }
コード例 #4
0
ファイル: ClassHoliday.cs プロジェクト: tokusan1015/SBMethod
        /// <summary>
        /// 対象年の全ての祝日を取得する
        /// 有効範囲 : 2000年~2099年
        /// 有効範囲外の場合は空の祝祭日一覧を返す
        /// </summary>
        /// <param name="iYear">対象年</param>
        /// <returns>祝祭日一覧</returns>
        public SortedDictionary <DateTime, HolidayInfo> GetAllHoliday(
            int iYear
            )
        {
            // 祝日を格納するコレクション
            var holidays = new SortedDictionary <DateTime, HolidayInfo>();

            // 対象年が有効範囲外の場合は空の祝祭日一覧を返す
            if (!this.CheckMinMaxYear(iYear))
            {
                return(holidays);
            }

            // 休日情報配列から休日カレンダーを生成する
            for (int i = 0; i < this._HolidayInfo.Count; i++)
            {
                // 休日情報を取得
                HolidayInfo hi = this._HolidayInfo[i];
                // 対象年内かチェックする
                if (hi._StartApplyYear <= iYear && hi._EndApplyYear >= iYear)
                {
                    // 対象年内なら所定の計算方法を使用して処理する

                    // 1.日付が固定の祝日(_Param == 0)
                    if (hi._Param == 0)
                    {
                        // 固定祝日を取得
                        hi._Date = new DateTime(
                            year: iYear,
                            month: hi._Date.Month,
                            day: hi._Date.Day
                            );
                    }
                    // 2. 日付けが「○月第△月曜日」のパターン(_Param > 0)
                    else if (hi._Param > 0)
                    {
                        // 〇月△週月曜日祝日を取得
                        hi._Date = GetNthMonday(
                            iNthMonday: hi._Param,
                            iYear: iYear,
                            iMonth: hi._Date.Month
                            );
                    }
                    // 3. 春分の日(_Param == -1)
                    else if (hi._Param == -1)
                    {
                        // 春分の日を取得
                        hi._Date = CalcVernalEquinoxDay(iYear: iYear);
                    }
                    // 4. 秋分の日(_Param == -2)
                    else if (hi._Param == -2)
                    {
                        // 秋分の日を取得
                        hi._Date = CalcAutumnalEquinoxDay(iYear: iYear);
                    }
                    else
                    {
                        // その他の場合は例外処理
                        throw new ArgumentOutOfRangeException();
                    }
                    // 休日に追加
                    holidays.Add(key: hi._Date, value: hi);
                }
            }

            // 5. 振替休日(1973年~)
            // 国民の祝日に関する法律 第3条2
            //「国民の祝日」が日曜日に当たるときは、その日後において
            // その日に最も近い「国民の祝日」でない日を休日とする。
            var substituteHolidays = GetSubstituteHolidays(sdHolidays: holidays);

            foreach (var s in substituteHolidays)
            {
                holidays.Add(key: s._Date, value: s);
            }

            // 6. 国民の休日(1985年~)
            // 国民の祝日に関する法律 第3条3
            // その前日及び翌日が「国民の祝日」である日(「国民の祝日」でない日に限る。)は、休日とする。
            var sandwichedHolidays = GetSandwichedHolidays(sdHolidays: holidays);

            foreach (var s in sandwichedHolidays)
            {
                holidays.Add(key: s._Date, value: s);
            }

            return(holidays);
        }