dongtanlin0765 2013-10-29 08:49
浏览 21
已采纳

在PHP中间隔的舍入时间

I want to convert times to rounded times.
Therefore I only want to use intervals in seconds. It works well for quarter hours and full hours. But not for days. Then it is messed up. But I can't understand why

This is my function:

function formatToMySQLTime($sTime,$iInterval){
    switch ($iInterval){
        case 1: // 15 minutes;
            $iDivider = 15 * 60;
            break;
        case 2: // 1 hour
            $iDivider = 60 * 60;
            break;
        case 3: // 1 day
            $iDivider = 60 * 60 * 24;
            break;
    }    
    $iRemainder = strtotime($sTime) % $iDivider;
    $iRoundTime = strtotime($sTime) - $iRemainder;    
    $sTime = date('Y-m-d H:i:s', $iRoundTime);
    return $sTime;
}

Here is the output:

echo formatToMySQLTime('2013-10-21 03:23:00',1);
2013-10-21 03:15:00

echo formatToMySQLTime('2013-10-21 03:23:00',2);
2013-10-21 03:00:00

echo formatToMySQLTime('2013-10-21 03:23:00',3);
2013-10-21 02:00:00

The third output is wrong, it should be 2013-10-21 00:00:00. What is my mistake?

  • 写回答

2条回答 默认 最新

  • dousi2553 2013-10-29 09:25
    关注

    You have timezone issue, because strtotime function is not timezone aware, and date is. Instead of setting global timezone, you can set it locally with appending UTC string to the $sTime variable, and instead of using date() use gmdate():

    // it doesn't matter in which timezone your are, function works with UTC
    date_default_timezone_set('Europe/Berlin');
    
    function formatToMySQLTime($sTime, $iInterval) {
        switch ($iInterval){
            case 1: // 15 minutes;
                $iDivider = 15 * 60;
                break;
            case 2: // 1 hour
                $iDivider = 60 * 60;
                break;
            case 3: // 1 day
                $iDivider = 60 * 60 * 24;
                break;
        }
        $U = strtotime($sTime . ' UTC');
        $iRoundTime = $U - $U % $iDivider;    
        return gmdate('Y-m-d H:i:s', $iRoundTime);
    }
    
    echo formatToMySQLTime('2013-10-21 03:23:00',1);
    echo formatToMySQLTime('2013-10-21 03:23:00',2);
    echo formatToMySQLTime('2013-10-21 03:23:00',3);
    

    Run code.


    Update:

    Instead of modifying function for every interval, you can make function a little more generic and readable, with the help of DateTime classes, like:

    function formatToMySQLTime($sTime, $iInterval) {
        $dt = new DateTime($sTime, new DateTimezone('UTC'));
        $U = $dt->getTimestamp();
    
        $dt2 = clone $dt;
        $interval = DateInterval::createFromDateString($iInterval);
        $iDivider = $dt2->add($interval)->getTimestamp() - $U;
    
        $dt->setTimestamp($U - $U % $iDivider);
        return $dt->format('Y-m-d H:i:s');
    }
    
    echo formatToMySQLTime('2013-10-21 03:23:00', '15 minute');
    echo formatToMySQLTime('2013-10-21 03:23:00', '1 hour');
    echo formatToMySQLTime('2013-10-21 03:23:00', '1 day');
    

    Run code.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 RPA正常跑,cmd输入cookies跑不出来
  • ¥15 求帮我调试一下freefem代码
  • ¥15 matlab代码解决,怎么运行
  • ¥15 R语言Rstudio突然无法启动
  • ¥15 关于#matlab#的问题:提取2个图像的变量作为另外一个图像像元的移动量,计算新的位置创建新的图像并提取第二个图像的变量到新的图像
  • ¥15 改算法,照着压缩包里边,参考其他代码封装的格式 写到main函数里
  • ¥15 用windows做服务的同志有吗
  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。