Я разрабатываю простую систему, чтобы наши сотрудники могли сэкономить сверхурочные, поэтому в конце месяца им платят за те дополнительные часы, которые они заработали.
Обычные часы считаются за 1, но ночные (с 23:00 до 07:00) должны составлять 1,25 часа каждый.
Тем не менее, мы просим представить день, а также часы начала и окончания. Итак, я подумал, что мог бы иметь такой массив:
$hours= array(
'0' => true, '1' => true, '2' => true, '3' => true, '4' => true, '5' => true, '6' => true,
'7' => false, '8' => false, '9' => false, '10' => false, '11' => false, '12' => false, '13' => false,
'14' => false, '15' => false, '16' => false, '17' => false, '18' => false, '19' => false, '20' => false,
'21' => false, '22' => false, '23' => true
);
Итак, в основном я проверяю, является ли час особенным или нет с циклом вроде этого:
$normals = 0;
$specials = 0;
$hour_since = '23:00:00';
$hour_since_expl = explode(':',$hour_since);
$hour_to = '23:15:00';
$hour_to_expl= explode(':',$hour_to );
$date = $fecha = '2012-03-14';
$datetime_since= strtotime($date ." ".$hour_since );
$datetime_to= ((int) $hour_to_expl[0] > (int) $hour_to_expl[0]) ?
strtotime(date("Y-m-d h:i:s", strtotime($date ." ".$hour_to)) . " +1 day") :
strtotime($date." ".$hour_to);
$difference = $datetime_to - $datetime_since;
$hours_difference = $difference / SECONDS_PER_HOUR; //60*60
for ($i = 0; $i <= $difference; $i++){
$hour = $i + (int) $hour_since_expl [0];
if ($hours[$hour]) //Special hour here... Pay more!
$specials++;
else
$normals++;
}
Но проблема в том, что часы не точны, и вы начали где-то, например, в 22:30 и закончили в 00:30, где у вас есть 0,5 часа, которые не являются особенными. Я боролся со своим умом, но не могу найти никакого решения.
У кого-нибудь есть идеи?
Редактировать : указан код.