表格:
开始日期:2016-06-01
工作 用时(天) 最后完成日
A0 1
A1 3
A3 3
B2 2
……………………………………………………
现在要求:根据开始日期(2016-06-01) + 工作天数 = 最后完成日
A0的最后完成日是2016-06-02 (2016-06-01开始,用时1天)
A1的最后完成日是2016-06-06 (2016-06-02开始,用时3天,本应该是2016-06-05日的,但5号这日是星期日,向后推一天)。
A3的最后完成日是2016-06-09
…………………………………
工作数据估计有300条(用时没有0.5天之类,都是整数)
感觉无从下手。求指导!
开始日期:2016-06-01
工作 用时(天) 最后完成日
A0 1
A1 3
A3 3
B2 2
……………………………………………………
现在要求:根据开始日期(2016-06-01) + 工作天数 = 最后完成日
A0的最后完成日是2016-06-02 (2016-06-01开始,用时1天)
A1的最后完成日是2016-06-06 (2016-06-02开始,用时3天,本应该是2016-06-05日的,但5号这日是星期日,向后推一天)。
A3的最后完成日是2016-06-09
…………………………………
工作数据估计有300条(用时没有0.5天之类,都是整数)
感觉无从下手。求指导!
解决方案
20
string[] nds = new string[] { "10/1", "1/1", "6/2" }; // 根据 sp 的提示,加上法定假日节点 public int GetDays(DateTime date, int days) // 开始日期,计划天数 { var holidays = nds.Select(s => DateTime.Parse(s)); // 获取法定假日,这里可能需要跨年判断,你本人想想 var dates = Enumerable.Range(0, days) // 获取计划日期中的休息天和法定假日天数,6/2 -> 6/5 试试结果 .Select(s => date.AddDays(s)) .Count(c => c.DayOfWeek == DayOfWeek.Sunday || holidays.Contains(c)); return days + dates; } // 调用 var beginDate = DateTime.Parse("2016-6-1"); // 开始日期 var days = GetDays(beginDate, 8); // 8 为工作日,返回包含休假的天数 var endDate = beginDate.AddDays(days); // 根据需要看是不是 -1 Console.WriteLine("{0:d}, {1:d}, {2}, {3}", beginDate, endDate, 8, days); // 下面的代码可以根据开始日期,天数,获取工作日期的数组 var allDates = Enumerable.Range(0, 8) .Select(s => beginDate.AddDays(s)) .ToArray(); Console.WriteLine(string.Join(",", allDates)); // 输出全部日期
20
直观点就是
static void Main(string[] args) { int n = 3; var start = DateTime.Parse("2016-06-24"); var end = start.AddDays(n + (int)(n / 7)); end = start.AddDays(n + WeekOfYear(end) - WeekOfYear(start)); Console.WriteLine("{0} - {1}", start, end); } public static int WeekOfYear(DateTime dt) { var ci = new CultureInfo("zh-CN"); return ci.Calendar.GetWeekOfYear(dt, ci.DateTimeFormat.CalendarWeekRule, ci.DateTimeFormat.FirstDayOfWeek); }
你没有提及法定假问题,本人也没必要画蛇添足