Позвольте мне увидеть, если я понимаю ваши требования:
рабочий запускается на стенде (8:30 утра) и обычно заканчивается в стандартное время (6:30 вечера), но может работать позже. Теоретически, что человек может работать в полночь на следующий день.
Если они работают с 7 вечера до 10 вечера, им платят одну сверхурочную работу.
Если они работают за 10 лет, эти часы оплачиваются второй скоростью.
Итак, первое, что вы должны объявить в своем коде список этих границ сверхурочные:
public static readonly TimeSpan[] OvertimeBoundaries =
{
TimeSpan.FromHours(19), // 7 PM
TimeSpan.FromHours(22) // 10 PM.
};
TimeSpan представляет собой структуру, которая представляет собой интервал времени, и подходит для представления ежедневно мероприятие.
Далее, учитывая рабоче время начала и окончания, вы хотите измерить общее количество часов для каждого из этих интервалов:
public static TimeSpan[] GetOvertimeWorked(DateTime startDateTime, DateTime endDateTime, IList<TimeSpan> overtimeBoundaries)
{
var overtimeWorked = new TimeSpan[overtimeBoundaries.Count];
for (int i = 0; i < overtimeBoundaries.Count - 1; i++)
{
var time1 = startDateTime.Date + overtimeBoundaries[i];
var time2 = startDateTime.Date + overtimeBoundaries[i + 1];
if (time1 > time2)
throw new ArgumentException("overtimeBoundaries are not in order");
if (endDateTime > time2)
overtimeWorked[i] = time2 - time1;
else if (endDateTime > time1)
overtimeWorked[i] = endDateTime - time1;
else
overtimeWorked[i] = TimeSpan.Zero;
}
if (overtimeWorked.Length > 0)
{
var timeLast = startDateTime.Date + overtimeBoundaries[overtimeBoundaries.Count - 1];
if (endDateTime > timeLast)
overtimeWorked[overtimeBoundaries.Count - 1] = endDateTime - timeLast;
else
overtimeWorked[overtimeBoundaries.Count - 1] = TimeSpan.Zero;
}
return overtimeWorked;
}
Наконец, вам нужно извлечь соответствующую дату & информацию о времени от вашего пользователя интерфейс, вызовите вышеуказанную утилиту, чтобы получить сверхурочное время работы и отобразить его.
Ваш код был бы более понятным, если бы вы назвали ваши переменные значимым, а не именами «dt2» и «awtsu». Вы также должны, как минимум, отделить свою бизнес-логику от кода, который загружает и выгружает данные из пользовательского интерфейса.
Наконец, отмечу, что следующее опасно:
string pmm = "10:00 PM";
DateTime pm = DateTime.Parse(pmm);
Проблема здесь состоит в том, что, если вы проходите «DateTime.Parse» строка с только «время суток» компонента, он будет fill in the date information with the current clock setting on your computer. Вероятно, это приведет к случайным, трудновоспроизводимым ошибкам, если вы добавите свое приложение в приложение, потому что приложение может быть запущено или не работать в другой день, чем работали работники!
umm В моем случае все работники начинаются в 8:30 и заканчиваются в 18:30, после чего сверхурочная работа начинается в 7 вечера и когда она достигает в 22 часа дня еще одного часа. после 10 вечера зарплата сверхурочных увеличивается. означающие 7-10 вечера и 10 вечера и далее - разные зарплаты. помогите мне, ребята, thx – cddr2012
Итак, вам нужно количество отработанных часов от 7 до 10, а также количество отработанных часов после 10? – dbc
да, сэр точно .. и когда им около часа в 7 вечера между 2 утра значение неверно – cddr2012