/// <summary> /// 休日を追加する /// </summary> /// <param name="hi">休日情報</param> public void AddHolidayInfo( HolidayInfo hi ) { this._HolidayInfo.Add( item: hi ); }
/// <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); }
/// <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); }
/// <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); }