工作分配的时间累加(不能是星期天)问题

sowinwork 2016-06-26 03:36:41
表格:

开始日期: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天之类,都是整数)
感觉无从下手。。求救!!!!
...全文
208 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuzuning 2016-06-27
  • 打赏
  • 举报
回复
原理
            int n = 3;
            var start = DateTime.Parse("2016-06-24");
            for (int i = 1; i <= n; i++)
            {
                if((int)start.AddDays(i).DayOfWeek == 0) n++;
            }
            Console.WriteLine(start.AddDays(n));
我叫小菜菜 2016-06-27
  • 打赏
  • 举报
回复
http://www.cnblogs.com/xiongqiangcs/p/3669933.html 附加个类似的acm题目,get到思路就好
我叫小菜菜 2016-06-27
  • 打赏
  • 举报
回复
其实很简单的问题,因为这是单路径线性的问题,A0-An有强制性先后顺序的。 直接遍历就得到结果了。 设计一个函数: //输入开始时间和所需天数,返回第An个任务的结束时间,包含假日顺延 Day doAn(Day start,int needDays) { } 最后一次300数组遍历,就得到最后的结束时间了。 自己在草纸上画一下就知道了嘛
秋的红果实 2016-06-27
  • 打赏
  • 举报
回复
还有一种是,借助数据库,数据库里存储一年的时间情况,假期包括法定节假日、周六日、单位临时调休等,总之,什么时候是工作日,什么时候不是,由用户自行定义 可以写个用户可以更新的模块,虽然每年需要更新,但是能解决具体问题,这要看什么单位了,例如有个阅读日(好像6.23),估计只有大型书城才会过的,其他单位不会过 这样设计,你就可以根据数据库里数据,直接取得最后工作时间了
wanghui0380 2016-06-27
  • 打赏
  • 举报
回复
引用 11 楼 xuzuning 的回复:
直观点就是
        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);
        }
你没有提及法定假问题,我也没必要画蛇添足
这个对滴,正准备这样回答滴,楼上抢了,只需要知道起点是星期几,到终点多少天,可以直接计算出有几个星期天(按需求只需要知道几个,没必要算那天是星期天)
xuzuning 2016-06-27
  • 打赏
  • 举报
回复
直观点就是
        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);
        }
你没有提及法定假问题,我也没必要画蛇添足
sowinwork 2016-06-27
  • 打赏
  • 举报
回复
引用 7 楼 qqamoon 的回复:
[quote=引用 3 楼 sowinwork 的回复:] [quote=引用 2 楼 qqamoon 的回复:] 全年的

var days = Enumerable.Range(0, DateTime.MinValue.AddYears(DateTime.Today.Year).AddDays(-1).DayOfYear)
    .Select(s => DateTime.MinValue.AddYears(DateTime.Today.Year - 1).AddDays(s))
    .Select(s => string.Format("{0,-15:d}{1,-10}{2}", s.Date, s.DayOfWeek, s.DayOfWeek == DayOfWeek.Sunday));

Console.WriteLine(string.Join("\r\n", days));
老大,没看我的问题啊。[/quote] 看啦,这不是给了你个日期数组吗,哪天是休息天都告诉你了 自己写个函数,返回工作开始和结束期间之间的休息日+工作日不就结了 [/quote] 现在弄乱我的就是结束日不知道(要去计算)。。。。。。。。。。。
引用 9 楼 qqamoon 的回复:

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)); // 输出所有日期
这个虽然不能直接解决我的问题,但给了我思路。。。。。。。顶上去,看看还有没有更好更直接的方法。。。。
龍过鸡年 2016-06-26
  • 打赏
  • 举报
回复

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)); // 输出所有日期
sowinwork 2016-06-26
  • 打赏
  • 举报
回复
引用 7 楼 qqamoon 的回复:
[quote=引用 3 楼 sowinwork 的回复:] [quote=引用 2 楼 qqamoon 的回复:] 全年的

var days = Enumerable.Range(0, DateTime.MinValue.AddYears(DateTime.Today.Year).AddDays(-1).DayOfYear)
    .Select(s => DateTime.MinValue.AddYears(DateTime.Today.Year - 1).AddDays(s))
    .Select(s => string.Format("{0,-15:d}{1,-10}{2}", s.Date, s.DayOfWeek, s.DayOfWeek == DayOfWeek.Sunday));

Console.WriteLine(string.Join("\r\n", days));
老大,没看我的问题啊。[/quote] 看啦,这不是给了你个日期数组吗,哪天是休息天都告诉你了 自己写个函数,返回工作开始和结束期间之间的休息日+工作日不就结了 [/quote] 现在弄乱我的就是结束日不知道(要去计算)。。。。。。。。。。。
龍过鸡年 2016-06-26
  • 打赏
  • 举报
回复
引用 3 楼 sowinwork 的回复:
[quote=引用 2 楼 qqamoon 的回复:] 全年的

var days = Enumerable.Range(0, DateTime.MinValue.AddYears(DateTime.Today.Year).AddDays(-1).DayOfYear)
    .Select(s => DateTime.MinValue.AddYears(DateTime.Today.Year - 1).AddDays(s))
    .Select(s => string.Format("{0,-15:d}{1,-10}{2}", s.Date, s.DayOfWeek, s.DayOfWeek == DayOfWeek.Sunday));

Console.WriteLine(string.Join("\r\n", days));
老大,没看我的问题啊。[/quote] 看啦,这不是给了你个日期数组吗,哪天是休息天都告诉你了 自己写个函数,返回工作开始和结束期间之间的休息日+工作日不就结了
sowinwork 2016-06-26
  • 打赏
  • 举报
回复
引用 4 楼 sp1234 的回复:
如果你要加上“假日”,那么你的规划就必须加上所有假日节点。例如你说A1用时3天,对不起,我根本不信!因为你这个所谓“3天”,假设遇上周末,你就用时5天才结束了;而假设遇上过年,那就用时10天才结束了;假设再遇上项目负责人生病住院,你就用时33天才结束了....... 因此过分纠结细节的数据就是谎言。PRT 的时间不考虑放假时间,制定时间计划本来就应该有相当大的富余,而 pert 时间本身不放假。如果放假,那么你的 A1 就不能算是A1,而应该拆成无数种可能性了。
老大,我要求很单纯,就是算出来,不考虑你说的那么多东西。
  • 打赏
  • 举报
回复
PERT 的时间不考虑放假时间,遇上计较的人内耗,什么样的管理技术都会被鸡蛋里挑骨头地。
  • 打赏
  • 举报
回复
如果你要加上“假日”,那么你的规划就必须加上所有假日节点。例如你说A1用时3天,对不起,我根本不信!因为你这个所谓“3天”,假设遇上周末,你就用时5天才结束了;而假设遇上过年,那就用时10天才结束了;假设再遇上项目负责人生病住院,你就用时33天才结束了....... 因此过分纠结细节的数据就是谎言。PRT 的时间不考虑放假时间,制定时间计划本来就应该有相当大的富余,而 pert 时间本身不放假。如果放假,那么你的 A1 就不能算是A1,而应该拆成无数种可能性了。
sowinwork 2016-06-26
  • 打赏
  • 举报
回复
引用 2 楼 qqamoon 的回复:
全年的

var days = Enumerable.Range(0, DateTime.MinValue.AddYears(DateTime.Today.Year).AddDays(-1).DayOfYear)
    .Select(s => DateTime.MinValue.AddYears(DateTime.Today.Year - 1).AddDays(s))
    .Select(s => string.Format("{0,-15:d}{1,-10}{2}", s.Date, s.DayOfWeek, s.DayOfWeek == DayOfWeek.Sunday));

Console.WriteLine(string.Join("\r\n", days));
老大,没看我的问题啊。
龍过鸡年 2016-06-26
  • 打赏
  • 举报
回复
全年的

var days = Enumerable.Range(0, DateTime.MinValue.AddYears(DateTime.Today.Year).AddDays(-1).DayOfYear)
    .Select(s => DateTime.MinValue.AddYears(DateTime.Today.Year - 1).AddDays(s))
    .Select(s => string.Format("{0,-15:d}{1,-10}{2}", s.Date, s.DayOfWeek, s.DayOfWeek == DayOfWeek.Sunday));

Console.WriteLine(string.Join("\r\n", days));
龍过鸡年 2016-06-26
  • 打赏
  • 举报
回复
Console.WriteLine(System.Globalization.CultureInfo.CurrentCulture.Calendar.GetDayOfWeek(DateTime.Parse("2016-06-05")));

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧