C# Cron表达式仅跳过一年中的公共假日
我有一个ASP.NETMVC应用程序,我们使用日历控件在UI上选择日期。我们正在使用cron表达式设置公共假日日期。我的要求是UI上的日期选择器不允许用户选择使用cron表达式设置的公共假日日期。我想验证我的cron表达式是否正确。如果正确,我的C代码有什么问题。我的函数未返回有效日期。其返回的假期也作为有效日期的一部分 以下是我需要跳过的假期列表——新年、阵亡将士纪念日、独立日、劳动节、感恩节、感恩节后的一天、圣诞晚会、圣诞 谢谢你的帮助!在代码和cron表达式下面,在GetDate函数的末尾,我试图获取有效的日期。 我正在寻找cron表达的只是公共假日(不是周末,不是假期)C# Cron表达式仅跳过一年中的公共假日,c#,asp.net,asp.net-mvc,cron,C#,Asp.net,Asp.net Mvc,Cron,我有一个ASP.NETMVC应用程序,我们使用日历控件在UI上选择日期。我们正在使用cron表达式设置公共假日日期。我的要求是UI上的日期选择器不允许用户选择使用cron表达式设置的公共假日日期。我想验证我的cron表达式是否正确。如果正确,我的C代码有什么问题。我的函数未返回有效日期。其返回的假期也作为有效日期的一部分 以下是我需要跳过的假期列表——新年、阵亡将士纪念日、独立日、劳动节、感恩节、感恩节后的一天、圣诞晚会、圣诞 谢谢你的帮助!在代码和cron表达式下面,在GetDate函数的末尾
List GetDates(DateTime截止日期,bool isAlways=false,string code=null,string TestMethod=null)
{
var validDates=新列表();
尝试
{
List cronExpressionString=new List();
cronExpressionStrings.Add(“0 0 1?*”);//新年
cronExpressionStrings.Add(“0-5周一#4*”)//阵亡将士纪念日
cronExpressionString.Add(“0 0 4 7?*”);//独立日
cronExpressionStrings.Add(“0?9周一”)//劳动节
cronExpressionStrings.Add(“0?11 THU#4*”)//感恩节
cronExpressionStrings.Add(“0-11周五#4*”)//感恩节后一天
cronExpressionString.Add(“0 0 24 12?*”);//圣诞晚会
cronExpressionString.Add(“0 0 25 12?*”);//Chrismas
var currentDateTimeWithPaddingDays=AddPaddingDaysToDate(DateTime.UtcNow);
if(cronExpressionString?.Count>0)
{
foreach(cronExpressionString中的字符串cronExpressionString)
{
var cronExpression=新的cronExpression(cronExpressionString);
//如果第一个填充日期与第一个Cron日期相同,则将该日期添加到有效日期中
var firstCronDate=cronExpression.GetNextValidTimeAfter(DateTime.UtcNow);
if(firstCronDate.Value.Date==currentDateTimeWithPaddingDays.Date)
{
如果(!validDates.Contains(currentDateTimeWithPaddingDays.Date))
{
添加(currentDateTimeWithPaddingDays.ToUniversalTime().Date);
}
}
DateTimeOffset?CurrentDateTimeWithPaddingDaysofset=currentDateTimeWithPaddingDays;
//如果没有使用下拉填充天数,则获取下一个Cron日期
如果(currentDateTimeWithPaddingDays.Date==DateTime.UtcNow.Date)
{
CurrentDateTimeWithPaddingDaysofset=cronExpression.GetNextValidTimeAfter(currentDateTimeWithPaddingDays).Value;
}
对于(var dateTimeOffset=CurrentDateTimeWithPaddingDaysofset;
(dateTimeOffset?日期<截止日期.日期);)
{
如果(!validDates.Contains(dateTimeOffset.Value.Date))
{
Add(dateTimeOffset.Value.Date);
}
dateTimeOffset=cronExpression.GetNextValidTimeAfter(dateTimeOffset.Value).Value;
}
}
}
其他的
{
var dateOnly=新日期时间(currentDateTimeWithPaddingDays.Year、currentDateTimeWithPaddingDays.Month、currentDateTimeWithPaddingDays.Day);
validDates.AddRange(可枚举的.Range(0,1+截止日期.减去(仅日期).天)
.Select(offset=>dateOnly.AddDays(offset))
.ToArray());
}
}
捕获(例外情况除外)
{
日志错误(“测试”,ex);
投掷;
}
返回validDates.OrderBy(d=>d.ToList();
}
private DateTime AddPaddingDaysToDate(日期时间日期)
{
尝试
{
var groupName=dropdownggroupname.PaddingMatrix.ToString();
var paddingMatrix=(来自context.DropDownValue.AsNoTracking()中的b)
在b.TableCode上的context.dropdowngGroup.AsNoTracking()中连接d
其中d.TableName==groupName
选择新的DropDownValueArgs
{
ID=d.ID,
Name=b.Name,
值=b.值,
描述=b.描述,
RegionCode=b.RegionCode
}).ToList();
如果(paddingMatrix.Count>0)
{
var paddingdays=paddingMatrix.Where(z=>string.Equals(z.Name,date.Hour.ToString(),StringComparison.InvariantCultureIgnoreCase)和&string.Equals(z.RegionCode,date.DayOfWeek.ToString(),StringComparison.InvariantCultureIgnoreCase))。选择(z=>z.Value.FirstOrDefault();
date=date.AddDays(double.Parse(paddingdays,System.Globalization.CultureInfo.InvariantCulture));
}
}
捕获(例外情况除外)
{
对数误差
List<DateTime> GetDates(DateTime cutOffDate, bool isAlways = false, string Code = null, string TestMethod = null)
{
var validDates = new List<DateTime>();
try
{
List<string> cronExpressionStrings = new List<string>();
cronExpressionStrings.Add("0 0 0 1 1 ? *"); // New Year Day
cronExpressionStrings.Add("0 0 0 ? 5 MON#4 *"); //Memorial Day
cronExpressionStrings.Add("0 0 0 4 7 ? *"); //Independence Day
cronExpressionStrings.Add("0 0 0 ? 9 MON#1"); //Labor Day
cronExpressionStrings.Add("0 0 0 ? 11 THU#4 *");//Thanksgiving
cronExpressionStrings.Add("0 0 0 ? 11 FRI#4 *");//Day after Thanksgiving
cronExpressionStrings.Add("0 0 0 24 12 ? *"); //Chrismas Evening
cronExpressionStrings.Add("0 0 0 25 12 ? *"); //Chrismas
var currentDateTimeWithPaddingDays = AddPaddingDaysToDate(DateTime.UtcNow);
if (cronExpressionStrings?.Count > 0)
{
foreach (string cronExpressionString in cronExpressionStrings)
{
var cronExpression = new CronExpression(cronExpressionString);
//If the first padded date is the same as the first Cron date then add that day to valid days
var firstCronDate = cronExpression.GetNextValidTimeAfter(DateTime.UtcNow);
if (firstCronDate.Value.Date == currentDateTimeWithPaddingDays.Date)
{
if (!validDates.Contains(currentDateTimeWithPaddingDays.Date))
{
validDates.Add(currentDateTimeWithPaddingDays.ToUniversalTime().Date);
}
}
DateTimeOffset? currentDateTimeWithPaddingDaysOffset = currentDateTimeWithPaddingDays;
//If no drop down padding days were used, then get next Cron date
if (currentDateTimeWithPaddingDays.Date == DateTime.UtcNow.Date)
{
currentDateTimeWithPaddingDaysOffset = cronExpression.GetNextValidTimeAfter(currentDateTimeWithPaddingDays).Value;
}
for (var dateTimeOffset = currentDateTimeWithPaddingDaysOffset;
(dateTimeOffset?.Date < cutOffDate.Date);)
{
if (!validDates.Contains(dateTimeOffset.Value.Date))
{
validDates.Add(dateTimeOffset.Value.Date);
}
dateTimeOffset = cronExpression.GetNextValidTimeAfter(dateTimeOffset.Value).Value;
}
}
}
else
{
var dateOnly = new DateTime(currentDateTimeWithPaddingDays.Year, currentDateTimeWithPaddingDays.Month, currentDateTimeWithPaddingDays.Day);
validDates.AddRange(Enumerable.Range(0, 1 + cutOffDate.Subtract(dateOnly).Days)
.Select(offset => dateOnly.AddDays(offset))
.ToArray());
}
}
catch (Exception ex)
{
log.Error("test", ex);
throw;
}
return validDates.OrderBy(d => d).ToList();
}
private DateTime AddPaddingDaysToDate(DateTime date)
{
try
{
var groupName = DropDownGroupName.PaddingMatrix.ToString();
var paddingMatrix = (from b in context.DropDownValue.AsNoTracking()
join d in context.DropDownGroup.AsNoTracking() on b.TableCode equals d.ID
where d.TableName == groupName
select new DropDownValueArgs
{
ID = d.ID,
Name = b.Name,
Value = b.Value,
Description = b.Description,
RegionCode = b.RegionCode
}).ToList();
if (paddingMatrix.Count > 0)
{
var paddingdays = paddingMatrix.Where(z => string.Equals(z.Name, date.Hour.ToString(), StringComparison.InvariantCultureIgnoreCase) && string.Equals(z.RegionCode, date.DayOfWeek.ToString(), StringComparison.InvariantCultureIgnoreCase)).Select(z => z.Value).FirstOrDefault();
date = date.AddDays(double.Parse(paddingdays, System.Globalization.CultureInfo.InvariantCulture));
}
}
catch (Exception ex)
{
log.Error("AddPaddingDaysToDate()", ex);
throw;
}
return date;
}
if (firstCronDate.Value.Date == currentDateTimeWithPaddingDays.Date)
{
if (!validDates.Contains(currentDateTimeWithPaddingDays.Date))
{
validDates.Add(currentDateTimeWithPaddingDays.ToUniversalTime().Date);
}
}
if (firstCronDate.Value.Date != currentDateTimeWithPaddingDays.Date)