// 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; namespace ChineseCalendar { /// /// 循环节假日 /// public abstract class LoopFestival : Festival { /// /// 尝试根据年月日获取一个日期 /// /// 年 /// 月 /// 日 /// 返回日期 /// 是否取到合法日期 protected virtual bool TryGetDate(int year, int month, int day, out DateTime date) { try { date = new DateTime(year, month, day); return true; } catch (Exception) { date = DateTime.Now; return false; } } /// public override DateTime? GetLastDate(DateTime? date, bool containsThisDate = false) { DateTime date2 = date.HasValue ? date.Value.Date : DateTime.Today; if (containsThisDate && IsThisFestival(date2)) { return date2; } if (TryGetDate(date2.Year, Month, Day, out DateTime date3) && date3 < date2) { return date3; } var year = date2.Year - 1; while (year >= DateTime.MinValue.Year && (!FirstYear.HasValue || year >= FirstYear.Value)) { if (TryGetDate(year, Month, Day, out DateTime date4)) { return date4; } year--; } return null; } /// public override DateTime? GetNextDate(DateTime? date, bool containsThisDate = false) { DateTime date2 = date.HasValue ? date.Value.Date : DateTime.Today; if (containsThisDate && IsThisFestival(date2)) { return date2; } if (TryGetDate(date2.Year, Month, Day, out DateTime date3) && date3 > date2) { return date3; } var year = date2.Year + 1; while (year <= DateTime.MaxValue.Year) { if (TryGetDate(year, Month, Day, out DateTime date4)) { return date4; } year++; } return null; } /// public override bool IsThisFestival(DateTime date) { return date.Month == this.Month && date.Day == this.Day; } } }