首页 文章

在C#上处理Windows服务的日期业务

提问于
浏览
2

我有一个要求,我需要在日期字段上工作,每天我需要管理一个发送和接收磁带进行处理备份,但是对于运营商有任何特殊条件,他们没有人同意在假期工作,所以要求是一些东西像这样

我将运行每次检查营业日期的服务,并且需要操作员在假期或周末(周六和周日)之前发送磁带驱动器:

  • 我有一个主假期表,所以我会在当前的 table 上寻找假期 .

  • 如果是 . 今天是服务第一次开始时的星期一 . 明天周二是假期,所以我必须在周一处理周二的所有工作 .

  • 如果是 . 今天是服务第一次开始时的星期一 . 明天周二和周三是假期,所以我必须处理周一和周三的所有工作 .

  • 如果是 . 今天是服务第一次开始时的星期一 . 明天周四是假期,所以我必须在星期四星期三办理所有工作 .

如果星期五没有放假,那么星期六和星期日必须处理流程磁带,如果假期然后星期五到星期日的流程磁带将在星期四进行处理,如果明天还有,那么仍然会继续这样的流程假期所以必须在明天之前处理,而不是在假期 .

我第一次运行服务Ex时出现问题,周二和周三是假期,我怎么知道?其实我不知道,我们怎么知道明天是否是假期继续进行 .

我已经通过多个if和else案例尝试了上述问题的解决方案,但只是想知道是否有任何通用和优雅的方式来做到这一点?

2 回答

  • 0

    Actually I didn't know, how we can to know if tomorrow is holiday to continue process.

    我不确定我是否理解这个问题,因为你可以测试明天是否像你今天一样测试假期 . 部分假日日期列表:

    hList = new List<Holiday>();
    hList.Add(new Holiday("Thanksgiving", new DateTime(2016, 11, 24)));
    hList.Add(new Holiday("Black Friday", new DateTime(2016, 11, 25)));
    
    hList.Add(new Holiday("May Day", new DateTime(2016, 05, 1)));
    hList.Add(new Holiday("Memorial Day", new DateTime(2016, 5, 30)));
    hList.Add(new Holiday("Cinco", new DateTime(2016, 5, 5)));
    
    hList.Add(new Holiday("FooBar Day", new DateTime(2016, 5, 18)));
    // like Carnival without the hangover:
    hList.Add(new Holiday("Ziggy Festival", new DateTime(2016, 2, 9)));
    hList.Add(new Holiday("Ziggy Festival", new DateTime(2016, 2, 10)));
    hList.Add(new Holiday("Ziggy Festival", new DateTime(2016, 2, 11)));
    

    这些是使用的更大列表中有趣的 . 不幸的是,大多数这些都创造了假日/周末的多日序列 . FooBar Day是单日游 .

    工作清单类,用于累积未来工作日期:

    public class WorkItem
    {
        // on this day...
        public DateTime Date { get; set; }
        // do work for these days:
        public List<DateTime> Tasks { get; private set; }
    
        public WorkItem(DateTime d)
        {
            Date = d.Date;
            Tasks = new List<DateTime>();
        }
    
        public void AddDay(DateTime dt)
        {
            if (!Tasks.Contains(dt.Date))
                Tasks.Add(dt.Date);
        }
    }
    

    testDates列表是每个假期条目前后3天的每个日期 . 扫描并创建工作清单:

    private void CreateHolidayWorkList()
    {
    
        WorkItem w;
        wList = new List<WorkItem>();
    
        foreach (DateTime dt in testDates)
        {
            // if today is Holiday, skip
            if (!IsHolidayOrWeekend(dt))
            {
                // is TOMORROW a holiday or weekend??
                //  AndAlso is it not alreay in the list
                if (IsHolidayOrWeekend(dt.AddDays(1)) && 
                        wList.FirstOrDefault(f=> f.Date.Date==dt.Date)==null)
                {
                    // current To-Do date 
                    w = new WorkItem(dt);
                    // scan ahead up to 6 days to find consecutive
                    // holiday/weekend dates
                    for (int n = 1; n <= 6; n++)
                    {
                        if (IsHolidayOrWeekend(dt.AddDays(n)))
                            w.AddDay(dt.AddDays(n));
                        else
                            break;
                    }
                    // add todo list to list
                    wList.Add(w);
                }
            }
        }
    }
    
    private bool IsHolidayOrWeekend(DateTime dt)
    {
        if (dt.DayOfWeek == DayOfWeek.Saturday || dt.DayOfWeek == DayOfWeek.Sunday)
            return true;
    
        return (hList.FirstOrDefault(q => q.Date == dt) != null);
    }
    

    一些结果:

    on 2016-02-08为以下工作: - > 2016-02-09 - > 2016-02-10 - > 2016-02-11 on 2016-02-12为以下工作: - > 2016-02-13 - > 2016-02-14 ... on 2016-05-04为以下事项工作: - > 2016-05-05 on 2016-05-17为以下事项工作: - > 2016-05-18 ... on 2016-11 -10做的工作: - > 2016-11-11 - > 2016-11-12 - > 2016-11-13 on 2016-11-23做的工作: - > 2016-11-24 - > 2016-11- 25 - > 2016-11-26 - > 2016-11-27

    • 工作清单不包括前一个工作日

    • 2/8工作清单是为期3天的Ziggy Festival

    • 2/12列表是"accidental"测试日期 . 它被包括在内,因为它是在Ziggy Festival的最后一天之后的3天内 . 这是周末的标准周五列表

    • 5/4和5/17表示单日假期

    • 最后两个只显示很长的假日字符串

  • 0

    我不能想到这里的通用方法,因为假期通常是打算使用您的服务的国家或组织的任意会计 . 据我所知,您必须将发送/处理磁带和假日列表的服务逻辑分开 . 当您定义假日列表(在db表中或简单地在xml中)时,您应该能够定义诸如日期和标志之类的内容来表示它是否是假日 . 现在,当您的服务执行时,它首先检查当天是否是假日;如果是这样,它可以跳过磁带加载,否则加载磁带当天和其他连续假期(查找从当前日期到下一个工作日的其他假期) .

相关问题