C# 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函数的末尾

我有一个ASP.NETMVC应用程序,我们使用日历控件在UI上选择日期。我们正在使用cron表达式设置公共假日日期。我的要求是UI上的日期选择器不允许用户选择使用cron表达式设置的公共假日日期。我想验证我的cron表达式是否正确。如果正确,我的C代码有什么问题。我的函数未返回有效日期。其返回的假期也作为有效日期的一部分

以下是我需要跳过的假期列表——新年、阵亡将士纪念日、独立日、劳动节、感恩节、感恩节后的一天、圣诞晚会、圣诞

谢谢你的帮助!在代码和cron表达式下面,在GetDate函数的末尾,我试图获取有效的日期。 我正在寻找cron表达的只是公共假日(不是周末,不是假期)

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)