0

我的表有一个以 mysqltime()格式格式化的列。
当它是一个值分配给名为 php 的变量时,$preRemainOt
我想将其重新排列到最近的 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.请给我一个想法。
2.如果我剩余的 ot value( $preRemainOt) 超过 24 小时 ex:$preRemainOt='26:43:00'会发生什么,这对 php 或 mysql 函数都无关紧要。
存储此类 ot 计算的最佳 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"胡说八道

4

1 回答 1

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 的值。

于 2012-12-28T07:48:18.747 回答