2013-06-22 3 views
3

У меня есть требование, чтобы на веб-сайте PHP было создано следующее.Расчет грануляции времени

Наши пользователи указывают значение «грануляции» в своем приложении - то есть 14400, которое представляет собой 4 часа времени.

Теперь, в основном, мне нужно отслеживать «действие» на основе этого грануляции с полуночи - например, если какое-либо действие происходит в 03:15, оно будет отслеживаться под временем 00:00 - 03 : 59, аналогично, если действие происходит в 4:25 утра, оно будет отслеживаться в 04:00 - 07:59.

Я пытаюсь написать функцию, которая имеет следующее:

function _get_granulation($granulation) 
{ 
    $time = date("G:i"); // Gives us current time (e.g. 04:15 or 22:10) 
    $iterations = ($granulation/86400); // Number of iterations in a 24hr period  
} 

Теперь я немного застрял, куда я иду отсюда.

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

Может ли кто-нибудь посоветовать/помочь отсюда?

+1

Что вы ожидаете от функции? Время начала временного сегмента? Числовой индекс, для которого сегмент времени находится в день (т. Е. 1-6 для вашего примера в 14400 часов)? – jcsanyi

+0

Что такое ожидание при смене летнего времени? –

+0

В идеале я хотел бы получить временной интервал, в котором это действие входит. Итак, значение времени ... – madebyhippo

ответ

0

Эта функция должна дать вам то, что вы ищете:

function _get_granulation($granulation, $now = null) { 
    if (is_null($now)) $now = time(); 
    $daySecs = date('G', $now) * 3600 + date('i', $now) * 60 + date('s', $now); 
    $segment = $granulation * floor($daySecs/$granulation); 
    $hrs = floor($segment/3600); 
    $min = floor(($segment - $hrs * 3600)/60); 
    $sec = $segment - $hrs * 3600 - $min * 60; 
    return date('H:i:s', mktime($hrs, $min, $sec)); 
} 

Я не использует Unix метку времени непосредственно, чтобы избежать перехода на летние проблемы, но вместо того, чтобы использовать фактические часы/минуты/секунды значения.

Я добавил дополнительные параметры для проверки, поэтому нам не всегда нужно использовать текущее время. Это позволяет тестовый скрипт так:

$times = array('10:30:00', '07:59:00', '23:20:00'); 
$granulations = array(21600, 14400, 3600, 1800); 
foreach ($granulations as $g) foreach ($times as $t) { 
    $segment = _get_granulation($g, strtotime($t)); 
    echo("{$t}/{$g} = {$segment}\n"); 
} 

Который производит вывод так:

10:30:00/21600 = 06:00:00 
07:59:00/21600 = 06:00:00 
23:20:00/21600 = 18:00:00 
10:30:00/14400 = 08:00:00 
07:59:00/14400 = 04:00:00 
23:20:00/14400 = 20:00:00 
10:30:00/3600 = 10:00:00 
07:59:00/3600 = 07:00:00 
23:20:00/3600 = 23:00:00 
10:30:00/1800 = 10:30:00 
07:59:00/1800 = 07:30:00 
23:20:00/1800 = 23:00:00