能帮我吗?我正在尝试创建一个考勤系统,该系统将自动计算加班时间和加班时间,但是有一个错误。例如,该员工的计划外时间是晚上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
答案 0 :(得分:1)
IMO,为了解决您的问题,您必须使用实际的datetime对象。
始终记录实际的系统日期时间,而无需对其进行操作。
对于您的情况,您应该具有记录scheduled_work_start
,scheduled_work_finished
和actual_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
。