// 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;
}
}
}