gpt4 book ai didi

c# - c-sharp 获取时间跨度内的工作时间

转载 作者:行者123 更新时间:2023-11-30 21:37:22 28 4
gpt4 key购买 nike

给定多个时间跨度,我怎样才能得到一个数组来给出一天的工作小时数。

工作时间从09:00开始到17:00结束

例子:

  1. 15-Nov-2017 16:00 - 17-Nov-2017 12:00 -> 应该给我一个 [1,8,3] 的数组

  2. 15-Nov-2017 09:00 - 17-Nov-2017 12:00 -> 应该给我一个 [8,8,1] 的数组(这看起来很简单,因为我可以做 Hrs/8 和% 8 小时得到结果。)

  3. 16-Nov-2017 15:00 - 17-Nov-2017 15:00 -> 应该给我一个 [2,6] 的数组

这是目前给我开始时间和结束时间之间的总工作时间的方法:

protected double getWorkingHrs(DateTime _dtTaskStart, DateTime _dtTaskEnd)
{
double count = 0;

for (var i = _dtTaskStart; i < _dtTaskEnd; i = i.AddHours(1))
{
if (i.DayOfWeek != DayOfWeek.Saturday && i.DayOfWeek != DayOfWeek.Sunday)
{
if (i.TimeOfDay.Hours >= 9 && i.TimeOfDay.Hours < 17)
{
count++;
}
}
}

return count;
}

如有任何帮助,我们将不胜感激。

任务在 8 小时内显示如下。所以当我添加一个 20 小时的任务时,我必须将它们分解成组并在网格中显示它们。我必须将它们分开,因为不同日期的任务可能会分配给不同的用户并且可能有不同的注释等。

UI for placing tasks

干杯

最佳答案

这里是你的问题的解决方案:

    public static double[] GetWorkHours(DateTime start, DateTime end, TimeSpan workStartTime, TimeSpan workEndTime)
{
IList<double> result = new List<double>();

if (start > end)
{
throw new ArgumentException("Start date is later than end date");
}

DateTime currentDate = start.Date;
while (currentDate <= end.Date)
{
if (currentDate.DayOfWeek != DayOfWeek.Saturday && currentDate.DayOfWeek != DayOfWeek.Sunday)
{
TimeSpan realStartTime = GetStartTimeForDay(start, end, workStartTime, currentDate);
TimeSpan realEndTime = GetEndTimeForDay(start, end, workEndTime, currentDate);

if (realStartTime >= workEndTime || realEndTime <= workStartTime)
{
result.Add(0);
}
else
{
result.Add(GetHoursInTimePeriod(realStartTime, realEndTime));
}
}

currentDate = currentDate.AddDays(1);
}

return result.ToArray();
}

private static TimeSpan GetStartTimeForDay(DateTime start, DateTime end, TimeSpan workStartTime, DateTime day)
{
return day == start.Date ? (start.TimeOfDay < workStartTime ? workStartTime : start.TimeOfDay) : workStartTime;
}

private static TimeSpan GetEndTimeForDay(DateTime start, DateTime end, TimeSpan workEndTime, DateTime day)
{
return day == end.Date ? (end.TimeOfDay < workEndTime ? end.TimeOfDay : workEndTime) : workEndTime;
}

private static double GetHoursInTimePeriod(TimeSpan start, TimeSpan end)
{
return (end - start).TotalHours;
}

关于c# - c-sharp 获取时间跨度内的工作时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47301975/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com