在.net core中使用C#计算基于8小时轮班的工作时间

问题描述 投票:0回答:1

大家好, 我正在开发一个时间管理应用程序作为我的项目的一部分。 我根据 8 小时轮班计算天数、小时数和分钟数。但是当我尝试计算剩余天数和工作天数时,它给出了错误的计算结果。 请检查我的代码

        var LeaveTotal = TotalWork(LeaveDays, leaveHours, LeaveMintues);

        var t1 = (int)LeaveTotal[0];
        var t2 = (int)LeaveTotal[1];
        var t3 = (int)LeaveTotal[2];
        TimeSpan date1 = new TimeSpan(t1, t2, t3,0);
        TimeSpan date2 = new TimeSpan(10, 0, 0,0);
        TimeSpan minutes = (date2.Subtract(date1)); 

现在,如果有 10 天的工作,而有人做了 8 天 5 小时的工作,那么我应该得到 1 天 3 小时作为剩余。 (基于 8 小时轮班制)。但我得到了有趣的结果。

        public double[] TotalWork(double days, double totalhours, double minutes)
    {
        double[] total = new double[3];

        var hours = Math.Floor(minutes / 60);
        totalhours += hours;

        days += Math.Floor(totalhours / 8);
        totalhours = totalhours % 8;

        var remianingMins = minutes - (hours * 60);

        total[0]=(days);
        total[1]=(totalhours);
        total[2]=(remianingMins);

        return total;
    }

请帮忙,我被困在这里了。预先感谢

c# entity-framework datetime core
1个回答
0
投票

我相信问题在于你正在使用 TimeSpan 减法,你应该在两个日期之间使用你自己的减法方法,因为你正在考虑一天 8 小时,你可以使用这样的函数,它接受两个 double 数组每个包含天、小时和分钟。

static double[] SubtractDates(double[] initialTime, double[] subtractedTime)
{
double initialDays = initialTime[0] + initialTime[1] / 8 + initialTime[2] / (8 * 60);
double subtractedDays = subtractedTime[0] + subtractedTime[1] / 8 + subtractedTime[2] / (8 * 60);

double remainingDays = initialDays - subtractedDays;

double remainingHours = Math.Floor((remainingDays % 1) * 8);
double remainingMinutes = Math.Floor(((remainingDays % 1) * 8 % 1) * 60);

remainingDays = Math.Floor(remainingDays);

double[] result = { remainingDays, remainingHours, remainingMinutes };
return result;
}

当然,迄今为止的数组必须首先通过 TotalWork() 函数才能与 8 小时制兼容。

© www.soinside.com 2019 - 2024. All rights reserved.