Как отличить часы? - PullRequest
0 голосов
/ 14 марта 2012

Я разрабатываю простую систему, чтобы наши сотрудники могли сэкономить сверхурочные, поэтому в конце месяца им платят за те дополнительные часы, которые они заработали.

Обычные часы считаются за 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 часа, которые не являются особенными. Я боролся со своим умом, но не могу найти никакого решения.

У кого-нибудь есть идеи?

Редактировать : указан код.

Ответы [ 3 ]

1 голос
/ 14 марта 2012

Предположим, что время начала 15:15, а время окончания - 22:45.Сначала преобразуйте время начала в ближайший час или позже, а время окончания в ближайший час или раньше.Итак, мы получаем 15:00 и 22:00.Используйте свой цикл для этих часов и используйте разницу следующим образом: если время разницы (15: 15-15: 00 или 22: 45-22: 00) сверхурочно, то выполняйте сверхурочно * numMins / 60, в противном случае выполняйте стандартные * numMins/ 60.Я не знаком с PHP, поэтому должен был сделать это в псевдокоде

1 голос
/ 14 марта 2012

edit: заняло немного времени, но мне нравятся интересные задачи; надеюсь, это поможет!

$specialStart = 23;
$specialEnd = 7;

$normals = 0;
$specials = 0;

$hour_since = '22:00:00';
$hour_since_expl = explode(':',$hour_since);
$start_time = mktime($hour_since_expl[0], $hour_since_expl[1], $hour_since_expl[2]);

$hour_to = '07:30:00';
$hour_to_expl= explode(':',$hour_to );
$end_time = mktime($hour_to_expl[0], $hour_to_expl[1], $hour_to_expl[2]);

if($end_time < $start_time){
    //worked passed minight, add a day
    $end_time = $end_time + 86400;  
}

$work_time = ( $end_time - $start_time ) / 60;

for($i = 0; $i < $work_time; $i++){
    $time = $start_time + ( $i * 60 );
    $hour_of_day = date("H", $time);
    if($hour_of_day >= $specialStart || $hour_of_day < $specialEnd){
        $specials += 60;    
    }else{
        $normals += 60;
    }
}

$specials = $specials / 3600;
$normals = $normals / 3600;
echo "specials: ".$specials;
echo "<br/>normals: ".$normals;
0 голосов
/ 14 марта 2012

Я бы посоветовал вам рассчитать общее время в двух отдельных полях. Сначала получите нормальные часы, то есть до 23:00, а затем специальные часы, то есть после 23:00 и до 07:00.

Тогда вы можете легко рассчитать оплату.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...