最近的15分钟

时间:2012-12-28 07:17:30

标签: php mysql time

我的表格中有一个以mysql time()格式格式化的列 当它的一个值分配给名为$preRemainOt的php变量时 我想把它安排到最近的15分钟

function roundTime($whatTime)
{

echo $whatTime."=>";

$roundTime= round ( strtotime($whatTime) / 60 * 15  );

echo date("H:i:s",$roundTime)."<br>";

return date("H:i:s",$roundTime);
}

    $validOt =roundTime($preRemainOt);

<pre>
few bad result given from my try as follow:
$preRemainOt=>$validO
    03:43:00=>06:55:45
    01:05:00=>06:16:15
    02:00:00=>06:30:00
but result shuld be as follow:
$preRemainOt=>$validO
    03:43:00=>03:45:00
    01:05:00=>01:00:00
    02:00:00=>02:00:00


1.pls给我一个主意。
2.如果剩余的ot值($preRemainOt)超过24小时,会发生什么 ex:$preRemainOt='26:43:00'与php或mysql函数无关 什么是存储这种计算的最佳mysql数据类型

UPDATE1
经过一些建议后,我将我的职能分散到了三个部分

function secondToTime($timeStamp)
{
        $hours=intval($timeStamp / 3600);
        $mins=intval($timeStamp / 60) % 60;
        $secs=$timeStamp % 60;
    return sprintf("%d:%02d:%02d",$hours, $mins, $secs);
}

function timeToSecond($time='00:00:00')
{
    list($hours, $mins, $secs) = explode(':', $time);
    $timeToSecond = ($hours * 3600 ) + ($mins * 60 ) + $secs;

    return $timeToSecond;
}

function roundTime($interval='00:00:00')
{
    $interval=timeToSecond($interval);
    $interval = intval($interval) + 450;
    $interval -= $interval % 900;
    return secondToTime($interval);
}

因为在列值分配到$preRemainOt变量之前,还有另外几个步骤。我也改变了这两个步骤,

function timeDiff($lastTime,$firstTime)
{
$firstTimetime=timeToSecond($firstTime);
$lastTime=timeToSecond($lastTime);
$timeDiff=$lastTime-$firstTime;

return secondToTime($timeDiff);
}

function timeAdd($firstTime,$lastTime)
{
$firstTimetime=timeToSecond($firstTime);
$lastTime=timeToSecond($lastTime);
$timeAdd=2*$lastTime-$firstTime;;
return secondToTime($timeAdd);
}

所以我决定使用select UNIX_TIMESTAMP()是很困难的。它会改变我的整个剧本。 在这种情况下"%d:%02d:%02d"给出废话

1 个答案:

答案 0 :(得分:2)

试试这个:

function roundTime($whatTime) {
    $time = strtotime($whatTime) + 450;
    return date("H:i:s", $time - $time % 900);
}

修改

实际上,根据您在下面的评论,这就是我要做的。如果这是一个时间间隔而不是文字时间点,我会将值存储在数据库中,作为整数秒而不是DATETIME类型。因此,30:37:29将被存储为110249,因为110249秒是30小时37分29秒。

然后,不要将“30:37:29”传递给此函数,而是超过110249.该函数将是:

function roundTime($interval) {
    $interval = intval($interval) + 450;
    $interval -= $interval % 900;
    return sprintf("%d:%02d:%02d",
        intval($interval / 3600),       // hours
        intval($interval / 60) % 60,    // minutes
        $interval % 60);                // seconds
}

如果您已经在数据库中存储了大量内容并且绝对无法将其转换为秒而不是DATETIME,那么在查询中,不使用查询DATETIME,而是使用UNIX_TIMESTAMP函数以及上面的函数。换句话说,而不是:

SELECT id, name, preRemainOt, other_stuff...

这样做:

SELECT id, name, UNIX_TIMESTAMP(preRemainOt) AS preRemainOt, other_stuff...

然后将该列的整数值传递给roundTime函数,而不是DATETIME的值。