上班时间算法,传入当前时间+任务预估小时 按上班时间的区间计算

EEEEEERROR 2023-08-29 14:51:13

某任务需要做15个小时。通过当前时间+15h 得出结束时间 2023/8/30 5:34:55
2023/8/29 14:34:55
2023/8/30 5:34:55        

但是这个时间是包含了休息时间。需求需要按上班时间来设置 最终15个小时 得出最后正确的结束时间.最后需要注意  21:00:00~08:00:00 是跨天的 那么结束时间+1天

上班时间
 08:30:00~12:00:00
 13:30:00~20:00:00
 21:00:00~08:00:00

 

想通过传入 一个开始时间  ,然后任务 小时数   两个参数    匹配上班时间算出正确的结束时间 。

最后还希望可以通过当前时间算出今天 剩余的工作时间是多少

 

...全文
成就一亿技术人!
拼手气红包 20.00元
1257 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
CSDN-Ada助手 2023-08-29
精选
  • 打赏
  • 举报
回复
您的问题已经帮您同步至问答, 链接: https://ask.csdn.net/questions/7993440, 请您保持关注, 如果回答有帮助解决此问题, 麻烦您动动小手给相关的回答点赞, Ada会在评论区为您更新结题状态
assky124 2023-08-29
  • 打赏
  • 举报
回复

算出每个时间段的时长,然后就是加减法了,你的一天有4个时间段。起始时间递归一下
00:00:0008:00:00 8小时
08:30:00
12:00:00 3.5小时
13:30:0020:00:00
21:00:00
24:00:00

EEEEEERROR 2023-08-29
  • 举报
回复
@assky124 这个我知道。我的问题是 传入一个日期带有时间的,并且用传入的这个日期+15个小时,如何 结束时间 ,休息时间是不算进去的,只能按上班时间有效时间算进去
EEEEEERROR 2023-08-29
  • 举报
回复
@EEEEEERROR 如何算出结束时间
今晚哒老虎 2023-08-29
  • 打赏
  • 举报
回复 1

public static void Main(string[] args)
    {
        DateTime currentDateTime = DateTime.Now;
        TimeSpan remainingWorkTime = CalculateRemainingWorkTime(currentDateTime);

        Console.WriteLine("剩余工作时间: " + remainingWorkTime.ToString());
    }

    public static TimeSpan CalculateRemainingWorkTime(DateTime currentDateTime)
    {
        TimeSpan remainingWorkTime = TimeSpan.Zero;

        // 获取当前时间的日期部分
        DateTime currentDate = currentDateTime.Date;

        // 设置上班时间范围
        TimeSpan workStartTime1 = new TimeSpan(8, 30, 0);
        TimeSpan workEndTime1 = new TimeSpan(12, 0, 0);
        TimeSpan workStartTime2 = new TimeSpan(13, 30, 0);
        TimeSpan workEndTime2 = new TimeSpan(20, 0, 0);
        TimeSpan workStartTime3 = new TimeSpan(21, 0, 0);
        TimeSpan workEndTime3 = new TimeSpan(8, 0, 0);

        // 判断当前时间是否在上班时间范围内
        if (currentDateTime.TimeOfDay >= workStartTime1 && currentDateTime.TimeOfDay <= workEndTime1)
        {
            remainingWorkTime = workEndTime1 - currentDateTime.TimeOfDay;
        }
        else if (currentDateTime.TimeOfDay >= workStartTime2 && currentDateTime.TimeOfDay <= workEndTime2)
        {
            remainingWorkTime = workEndTime2 - currentDateTime.TimeOfDay;
        }
        else if (currentDateTime.TimeOfDay >= workStartTime3 || currentDateTime.TimeOfDay <= workEndTime3)
        {
            remainingWorkTime = workEndTime3 - currentDateTime.TimeOfDay;
        }

        return remainingWorkTime;
    }
EEEEEERROR 2023-08-29
  • 举报
回复
@今晚哒老虎 结束时间如何算。您这个是帮我算出了 当前剩余可工作时间
今晚哒老虎 2023-08-29
  • 举报
回复
@EEEEEERROR public static void Main(string[] args) { DateTime startTime = new DateTime(2023, 8, 29, 9, 0, 0); // 设置开始工作时间 int workHours = 15; // 设置工作时长(小时) DateTime endTime = CalculateEndTime(startTime, workHours); Console.WriteLine("结束时间: " + endTime.ToString()); } public static DateTime CalculateEndTime(DateTime startTime, int workHours) { DateTime endTime = startTime; // 设置上班时间范围 TimeSpan workStartTime1 = new TimeSpan(8, 30, 0); TimeSpan workEndTime1 = new TimeSpan(12, 0, 0); TimeSpan workStartTime2 = new TimeSpan(13, 30, 0); TimeSpan workEndTime2 = new TimeSpan(20, 0, 0); TimeSpan workStartTime3 = new TimeSpan(21, 0, 0); TimeSpan workEndTime3 = new TimeSpan(8, 0, 0); // 计算结束时间 while (workHours &gt; 0) { if (endTime.TimeOfDay &gt;= workStartTime1 && endTime.TimeOfDay &lt;= workEndTime1) { TimeSpan remainingWorkTime = workEndTime1 - endTime.TimeOfDay; if (remainingWorkTime.TotalHours &gt;= workHours) { endTime = endTime.AddHours(workHours); workHours = 0; } else { endTime = endTime.Add(remainingWorkTime); workHours -= (int)remainingWorkTime.TotalHours; } } else if (endTime.TimeOfDay &gt;= workStartTime2 && endTime.TimeOfDay &lt;= workEndTime2) { TimeSpan remainingWorkTime = workEndTime2 - endTime.TimeOfDay; if (remainingWorkTime.TotalHours &gt;= workHours) { endTime = endTime.AddHours(workHours); workHours = 0; } else { endTime = endTime.Add(remainingWorkTime); workHours -= (int)remainingWorkTime.TotalHours; } } else if (endTime.TimeOfDay &gt;= workStartTime3 || endTime.TimeOfDay &lt;= workEndTime3) { TimeSpan remainingWorkTime = workEndTime3 - endTime.TimeOfDay; if (remainingWorkTime.TotalHours &gt;= workHours) { endTime = endTime.AddHours(workHours); workHours = 0; } else { endTime = endTime.Add(remainingWorkTime); workHours -= (int)remainingWorkTime.TotalHours; } } // 跨天处理 if (endTime.TimeOfDay &gt;= workEndTime3) { endTime = endTime.AddDays(1).Date.Add(workStartTime1); } } return endTime; }
EEEEEERROR 2023-08-30
  • 举报
回复
@今晚哒老虎 还是不行,我用你的改了一下 传入的参数: startTime :2023/8/30 10:08:41 workHours:15 timeRange: 08:30:00-12:00:00 13:30:00-18:00:00 19:00:00-08:00:00 public static DateTime CalculateEndTime(DateTime startTime, decimal workHours, List&lt;List&lt;TimeSpan&gt;&gt; timeRange) { DateTime endTime = startTime; // 计算结束时间 while (workHours &gt; 0) { int ix = 0; foreach (var item in timeRange) { TimeSpan workStartTime = item[0]; TimeSpan workEndTime = item[1]; if (endTime.TimeOfDay &gt;= workStartTime && endTime.TimeOfDay &lt;= workEndTime) { TimeSpan remainingWorkTime = workEndTime - endTime.TimeOfDay; var TotalHours = Math.Round(remainingWorkTime.TotalHours, 5, MidpointRounding.AwayFromZero); //if (remainingWorkTime.TotalHours &gt;= double.Parse(workHours.ToString())) if (TotalHours &gt; 0) { if (TotalHours &gt;= double.Parse(workHours.ToString())) { endTime = endTime.AddHours(double.Parse(workHours.ToString())); workHours -= workHours; if (workHours == 0) break; } else { endTime = endTime.AddHours(TotalHours); workHours -= decimal.Parse(TotalHours.ToString()); if (workHours == 0) break; } } } // 跨天处理 if (endTime.TimeOfDay &gt;= workEndTime && ix == timeRange.Count - 1) { endTime = endTime.AddDays(1).Date.Add(workStartTime); } ix++; } } return endTime; }

111,101

社区成员

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

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

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