Я написал эту функцию, чтобы вычислить продолжительность между заданными двумя временными метками (с миллисекундами).

могу обернуть мой мозг вокруг этого, поэтому я надеюсь, что кто-то может помочь. У меня есть трек песни, длина которого в миллисекундах. У меня также есть дата исполнения песни в формате DATETIME. Я пытаюсь выяснить, сколько миллисекунд осталось во времени воспроизведения песни.

пример

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

Я использую следующее, чтобы определить оставшееся время, но оно не кажется правильным.

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

Любая помощь будет принята с благодарностью.

 thetaiko17 янв. 2011 г., 17:11
 dqhendricks17 янв. 2011 г., 17:29
учитывая, что DATETIME имеет точность только с точностью до секунды, а не миллисекунды ... это было бы довольно сложно.
 jason4517 янв. 2011 г., 17:32
Спасибо за ответ. Я использую переменную $ timeleft в javascript setTimeout, но она не корректно запускает функцию после оставшегося времени. Оставшееся время слишком быстро, оно обновляется примерно за 2 секунды вместо правильного количества времени.
 Ciprian L.17 янв. 2011 г., 17:17
Что вы подразумеваете под "не кажется правильным"?
 jason4517 янв. 2011 г., 17:38
Другое решение, которое я мог бы использовать, - получить оставшееся время в секундах, а затем преобразовать секунды в миллисекунды.

Ответы на вопрос(5)

затем получить разницу. Если у вас есть миллисекунды, unixtimestamp будет иметь цифры после десятичной дроби. Если у вас есть разница, вы можете преобразовать это значение обратно в шаблон даты и времени, используя функцию date в php. Ниже ссылка.

Удачи!

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

Решение Вопроса

возможно, они могут вам помочь:

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

 ItsMeDom23 июн. 2014 г., 01:54
Неплохо, еще несколько комментариев было бы неплохо ... Кроме этого хорошего кодирования!

$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)

Надеюсь, вы примете его для своих нужд.

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;
}
 JCarlos31 янв. 2017 г., 22:27
Всегда возвращает ноль.

чтобы вычислить продолжительность между заданными двумя временными метками (с миллисекундами).

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

Ваш ответ на вопрос