【问题标题】:How to get time difference in milliseconds如何获得以毫秒为单位的时差
【发布时间】:2011-01-17 16:10:03
【问题描述】:

我无法将我的大脑包裹在这个问题上,所以我希望有人能提供帮助。我有一个歌曲曲目,其歌曲长度以毫秒为单位。我还有以 DATETIME 格式播放的歌曲的日期。我要做的是找出歌曲播放时间还剩多少毫秒。

例子

$tracktime = 219238;  
$dateplayed = '2011-01-17 11:01:44';  
$starttime = strtotime($dateplayed);

我正在使用以下方法来确定剩余时间,但它似乎不正确。

$curtime = time();   
$timeleft = $starttime+round($tracktime/1000)-$curtime;  

任何帮助将不胜感激。

【问题讨论】:

  • “看起来不正确”是什么意思?
  • 考虑到 DATETIME 只能精确到秒,而不是毫秒......这将非常困难。
  • 感谢您的回复。我在 javascript setTimeout 中使用 $timeleft 变量,但在剩余时间后它没有正确运行该函数。剩下的时间太快了,它会在大约 2 秒内更新,而不是正确的时间。
  • 我可以使用的另一种解决方案是以秒为单位的剩余时间,然后将秒转换为毫秒。

标签: php


【解决方案1】:

出于我的需要,我使用了以下方法:

$curTime = microtime(true);
// something time consuming here
...
// get time difference in milliseconds
$timeConsumed = round(microtime(true) - $curTime,3)*1000; 

所以,关键是我们在这里使用浮点表示时间(参见http://php.net/manual/en/function.microtime.php

希望您会根据自己的需要采用它。

【讨论】:

    【解决方案2】:

    我使用以下一组函数来处理 mysql 日期,也许它们可以帮助你:

    function sqlArray($date, $trim=true) {
        $result = array();
        $result['day'] = ($trim==true) ? ltrim(substr($date,8,2),'0') : substr($date,8,2);
        $result['month'] = ($trim==true) ? ltrim(substr($date,5,2),'0') : substr($date,5,2);
        $result['year'] = substr($date,0,4);
        $result['hour'] = substr($date,11,2);
        $result['minutes'] = substr($date,14,2);
        return $result;
    }
    
    function sqlInt($date) {
        $date = sqlArray($date);
        return mktime($date['hour'], $date['minutes'], 0, $date['month'], $date['day'], $date['year']);
    }
    
    function difference($dateStart, $dateEnd) {
        $start = sqlInt($dateStart);
        $end = sqlInt($dateEnd);
        $difference = $end - $start;
        $result = array();
        $result['ms'] = $difference;
        $result['hours'] = $difference/3600;
        $result['minutes'] = $difference/60;
        $result['days'] = $difference/86400;
        return $result;
    }
    

    在你的情况下应该是这样的:

    $dateplayed = '2011-01-17 11:01:44'; 
    print_r(difference($dateplayed, date('Y:m:d')));
    

    希望它有效:D

    【讨论】:

    • 还不错,再多几个 cmets 就好了……除了那些好的编码!
    【解决方案3】:

    我编写了这个函数来计算给定两个时间戳之间的持续时间(以毫秒为单位)。

    function calculateTransactionDuration($startDate, $endDate)
    {
        $startDateFormat = new DateTime($startDate);
        $EndDateFormat = new DateTime($endDate);
        // the difference through one million to get micro seconds
        $uDiff = ($startDateFormat->format('u') - $EndDateFormat->format('u')) / (1000 * 1000);
        $diff = $startDateFormat->diff($EndDateFormat);
        $s = (int) $diff->format('%s') - $uDiff;
        $i = (int) ($diff->format('%i')) * 60; // convert minutes into seconds
        $h = (int) ($diff->format('%h')) * 60 * 60; // convert hours into seconds
    
        return sprintf('%.6f', abs($h + $i + $s)); // return total duration in seconds
    }
    
    $startDate = '02-Mar-16 07.22.13.000548';
    $endDate = '02-Mar-16 07.22.14.000072';
    $difference = calculateTransactionDuration($startDate, $endDate);
    
    //Outputs 0.999524 seconds
    

    【讨论】:

      【解决方案4】:

      您可以将日期时间字符串/输入转换为 unixtimestamp,然后获取差异。如果你确实有毫秒,unixtimestamp 会有小数点后的数字。一旦有了差异,您就可以使用 php.ini 中的函数 date 将该值转换回您的日期时间模式。下面是链接。

      祝你好运!

      http://php.net/manual/en/function.date.php

      【讨论】:

        【解决方案5】:

        我为自己使用了这个功能:

        public function calculateStringTimeToMiliseconds($timeInString)
        {
            $startTime = new \DateTime("now");
            $endDate = new \DateTime($timeInString);
        
            $interval = $startTime->diff($endDate);
        
            $totalMiliseconds = 0;
            $totalMiliseconds += $interval->m * 2630000000;
            $totalMiliseconds += $interval->d * 86400000;
            $totalMiliseconds += $interval->h * 3600000;
            $totalMiliseconds += $interval->i * 60000;
            $totalMiliseconds += $interval->s * 1000;
        
            return $totalMiliseconds;
        }
        

        【讨论】:

        • 它总是返回零。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-08-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-28
        相关资源
        最近更新 更多