2014-09-13 3 views
0

Мне нужно рассчитать несколько событий сна за 24- и 48-часовой период прокатки.Нужно вычислить прошедшее время по «сдвинутому окну» (PHP)

Расчеты времени сами по себе не являются проблематичными, так как это касается периода прокатки.

То, что я имею в виду под «прокатной период» выглядит следующим образом: сон

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

Но то, что мне нужно для захвата, - это то, сколько сна у сменщика было в течение 24 часов и 48 часов до определенного времени, например, 4 часа дня. Но конкретное время меняется.

Итак, наш сменный рабочий спит 1 сентября с 01:00 до 08:00 и имеет выходной день. Она спит снова 1 сентября с 22:00 до 06:00 2 сентября и начинает работу в 06:30 2 сентября.

Мне нужен алгоритм для расчета того, сколько сна у нее было за 24 часа до с 6:30 утра (т. е. с 6:30 1 сентября) и за 48 часов до этого.

Я даже не могу думать, как это просто описать, давайте сделаем алгоритм.

Все, что я могу придумать, состоит в том, чтобы иметь массив из 48 элементов, каждый из которых представляет собой час, а во время записи сна заселяют каждый массив, когда часть каждого часа спала, а затем катит массив каждый час.

Доверие к мозгам?

+0

Как хранятся время сна и время работы? Можете ли вы показать мне свои переменные. Это может помочь узнать, как это записывается в db. –

+0

Привет @SmithSmithy. Я еще не закодировал эту часть проекта, потому что я хотел сохранить открытый разум. Данные поступают с использованием текстового формата для времени запуска сна, в котором я буду использовать строковые функции для синтаксического анализа (необработанный формат, над которым у меня нет контроля, выглядит так: 28 апреля 2014 года в 06:08 утра) и прошедшее время находится в секундах. –

ответ

0

Самый простой способ справиться с расчетами даты или времени в php - DateTime objects. Я должен буду сделать некоторые предположения о формате ваших данных, но по моему опыту эта настройка является общей.

<?php 

/** Your data */ 
$sleepCycles = array(
    /** Dates as YYYY-MM-DD and times as HH:ii:ss */ 
    array('sleepid'=>1,'startdate'=>'2014-01-01','starttime'=>'08:00:00','lengthinseconds'=>28800), 
    array('sleepid'=>2,'startdate'=>'2014-01-05','starttime'=>'17:00:00','lengthinseconds'=>28800) 
    ); 

/** The start and end of your rolling check period. 
* $hoursToCheck and $start should be input. 
* $start should be in format "YYYY-mm-dd HH:ii:ss" 
*/ 
$rollStart = new DateTime($start); 
$rollEnd = new DateTime($start); 
/** $hoursToCheck should be a number or a string that resolves to a number. */ 
$rollEnd->modify('+'.$hoursToCheck.' hour'); 


/** The counter for how much sleep falls within your check */ 
$amountSleptInSeconds = 0; 
foreach ($sleepCycles as $sc) 
{ 
    $startDateObj = new DateTime($sc['startdate'] .' '. $sc['starttime']); 
    $endDateObj = new DateTime($sc['startdate'] .' '. $sc['starttime']); 
    $endDateObj->modify('+'.$sc['lengthinseconds'].' second'); 

    /** 
    * If either the start or end of the sleep cycle fall 
    * inside the rolling check period, 
    * some part of the sleeping counts. 
    */ 
    if ($rollStart <= $startDateObj && $startDateObj >= $rollEnd) 
    { 
    /** Get the time that counts. Note it may not be the entire sleep period. 
    * If both ends of the sleep also falls inside the check, count the entire 
    * length. If not, only count the sleep that is inside. 
    */ 
    if ($endDateObj >= $rollEnd) 
    { $amountSleptInSeconds += $sc['lengthinseconds']; } 
    else 
    { 
     $countMeInterval = $startDateObj->diff($rollEnd , TRUE); 
     $amountSleptInSeconds += $countMeInterval->format('%s'); 
    } 

    } 
    else if ($rollStart <= $endDateObj && $endDateObj >= $rollEnd) 
    { 
    if ($rollStart <= $startDateObj) 
    { $amountSleptInSeconds += $sc['lengthinseconds']; } 
    else 
    { 
     $countMeInterval = $rollEnd->diff($startDateObj , TRUE); 
     $amountSleptInSeconds += $countMeInterval->format('%s'); 
    } 

    } 
} 

print 'Within time period ' 
    .$rollStart->format('M j, Y g:ia').' - ' 
    .$rollEnd->format('M j, Y g:ia') 
    .' (inclusive of end points) I found this amount of seconds of sleep: ' 
    .$amountSleptInSeconds; 
?>