Получать сверхурочные и сверхурочно автоматически - PullRequest
0 голосов
/ 09 января 2019

Не могли бы вы помочь мне? Я пытаюсь создать систему посещаемости, в которой время и сверхурочные будут автоматически рассчитываться, но есть ошибка. Например, у сотрудника запланировано 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 голосов
/ 09 января 2019

Давайте начнем с того, что будем называть ваши переменные чем-то, что помогает нам рассуждать о коде.

// 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.

0 голосов
/ 10 января 2019

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) и предположит, что она проработала один час сверхурочно. Система должна записать фактическое время работы как 11-01-2019 00:00:00 (12 AM) Когда вам нужно рассчитать или узнать дополнительное время вычислить:

<code>var over_time_in_hours = actual_work_finished.Substract(scheduled_work_finished).TotalHours;

Надеюсь, это имеет смысл.

0 голосов
/ 09 января 2019

Если вы печатаете ваши d1 и d2 раз:

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

Тогда ожидаемый результат - 23-0 = 23.

Кстати, вы можете достичь своего результата, добавив 1 день к объекту времени d1 и вычтя этот результат из объекта d2:

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