自动获得加班和加班

时间:2019-01-09 06:53:44

标签: c# datetime timespan

能帮我吗?我正在尝试创建一个考勤系统,该系统将自动计算加班时间和加班时间,但是有一个错误。例如,该员工的计划外时间是晚上11点,而他们的加班时间是12点,这是1个小时,但输出是23。有人可以帮我计算出经过的时间吗?

string datetime = "12:00 AM"; // this is the time you are going to time out
string OUT = "11:00 PM"; // this is your scheduled out
DateTime d1 = Convert.ToDateTime(datetime);
DateTime d2 = Convert.ToDateTime(OUT); 
TimeSpan ts = d2.Subtract(d1);

MessageBox.Show(ts.TotalHours.ToString()); // output is 23 which is wrong, it must be 1 hour overtime only

3 个答案:

答案 0 :(得分:1)

IMO,为了解决您的问题,您必须使用实际的datetime对象。 始终记录实际的系统日期时间,而无需对其进行操作。 对于您的情况,您应该具有记录scheduled_work_startscheduled_work_finishedactual_work_finished的字段 例如,假设一名员工在10-01-2019 14:00:00 (2 PM)开始工作,并在10-01-2019 23:00:00 (11 PM)完成工作,并假设她加班了1个小时。 系统应将实际工作完成时间记录为11-01-2019 00:00:00 (12 AM) 当您需要计算或找出额外时间时 计算:

var over_time_in_hours = actual_work_finished.Substract(scheduled_work_finished).TotalHours;

希望这很有道理。

答案 1 :(得分:0)

如果您打印d1和d2次:

d1 time => "09.01.2019 00:00:00". 
d2 time => "09.01.2019 23:00:00".

然后23-0 = 23是预期结果。

通过向d1时间对象添加1天并从d2对象中减去该结果,可以达到结果:

TimeSpan ts = d1.AddDays(1).Subtract(d2);
Console.WriteLine(ts.TotalHours.ToString());

答案 2 :(得分:0)

让我们从命名变量开始,这可以帮助我们推理代码。

// this is the time you are going to time out
DateTime actual = Convert.ToDateTime("12:00 AM");

// this is your scheduled out
DateTime scheduled = Convert.ToDateTime("11:00 PM"); 

TimeSpan overtime = scheduled.Subtract(actual);

我们发现,开始时您执行了错误的计算。这将是正确的计算:

TimeSpan overtime = actual.Subtract(scheduled);

尽管这样做,我们现在得到-23 hours。这是因为您的actual时间不在您的scheduled时间之后。为此,您需要添加一天。

尝试一下:

// this is the time you are going to time out
DateTime actual = Convert.ToDateTime("12:00 AM").AddDays(1);

// this is your scheduled out
DateTime scheduled = Convert.ToDateTime("11:00 PM"); 

TimeSpan overtime = actual.Subtract(scheduled);

然后,您将获得所需的结果-即1 hour