我需要在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
}
现在我对离开这里的地方有点困惑。
从根本上说,我需要做的就是将时间值传递回来,代表记录条目的时间范围。
有人可以从这里提出建议/帮助吗?
答案 0 :(得分: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