表格:
开始日期: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);
}
你没有提及法定假问题,本人也没必要画蛇添足