2013-08-15 1 views
2

я могу получить DateTime с микросекунд в PHP с обходного как:Разница с микросекунды точности между двумя DateTime в PHP

list($usec, $sec) = explode(" ", microtime()); 
echo date("Y-m-d\TH:i:s", $sec) . "." . floatval($usec)*pow(10,6); 

мне нужна разница с микросекунд между двумя DateTimes, не может получить обходной путь для :

$datetime1 = new DateTime('2013-08-14 18:49:58.606'); 
$datetime2 = new DateTime('2013-08-14 22:27:19.272'); 
$interval = $datetime1->diff($datetime2); 
echo $interval->format('%h hours %i minutes %s seconds %u microseconds'); 

DateInterval::format не имеет формат символ% и или эквивалентные микросекунды.

Кто-нибудь знает обходное решение для этого?

+1

'DateInterval' не поддерживает микросекунд. А также 'DateTime' их не поддерживает. Все точки, которые вы должны выполнить все связанные вычисления вручную, чтобы достичь такой точности. – baldrs

+0

DateTime :: createFromFormat() недавно добавил формат 'u' (PHP 5.5?), Хотя я не могу найти никаких доказательств того, что он поддерживается DAteInterval –

+0

@Baldrs Я знаю, но с функциями времени легко сделать ошибки, Я прошу об обходном решении, нестандартном решении. –

ответ

0

вручную создания объекта DateTime с микро секунд:

$d = new DateTime("15-07-2014 18:30:00.111111"); 

Получение DateTime объекта текущего времени с микросекунд:

$d = date_format(new DateTime(),'d-m-Y H:i:s').substr((string)microtime(), 1, 8); 

Разница между двумя объектами DateTime в микросекундах (например, возврат: 2.218939)

//Returns the difference, in seconds, between two datetime objects including 
//the microseconds: 

function mdiff($date1, $date2){ 
//Absolute val of Date 1 in seconds from (EPOCH Time) - Date 2 in seconds from (EPOCH Time) 
$diff = abs(strtotime($date1->format('d-m-Y H:i:s.u'))-strtotime($date2->format('d-m-Y H:i:s.u'))); 

//Creates variables for the microseconds of date1 and date2 
$micro1 = $date1->format("u"); 
$micro2 = $date2->format("u"); 

//Absolute difference between these micro seconds: 
$micro = abs($micro1 - $micro2); 

//Creates the variable that will hold the seconds (?): 
$difference = $diff.".".$micro; 

return $difference; 
} 

По существу он находит разницу для объектов DateTime, используя strtotime, а затем добавляет дополнительные микросекунды.

+0

Почему вы используете strtotime (формат $ date1-> ('d-m-Y H: i: s.u')) вместо strtotime (формат $ date1-> ('d-m-Y H: i: s'))? –

+0

Я думаю, это не имеет значения, так как значение u всегда будет одинаковым –

0

мне пришлось заменить этот

$micro = abs($micro1 - $micro2); 

с этим

str_pad(abs($micro1 - $micro2), 6, '0', STR_PAD_LEFT); 

, чтобы получить правильный микропоры по какой-то причине.

0
function mdiff($date1, $date2){ 
    //Absolute val of Date 1 in seconds from (EPOCH Time) - Date 2 in seconds from (EPOCH Time) 
    $diff = abs(strtotime($date1->format('d-m-Y H:i:s.u'))-strtotime($date2->format('d-m-Y H:i:s.u'))); 

    //Creates variables for the microseconds of date1 and date2 
    $micro1 = $date1->format("u"); 
    $micro2 = $date2->format("u"); 

    //Difference between these micro seconds: 
    $diffmicro = $micro1 - $micro2; 

    list($sec,$micro) = explode('.',((($diff) * 1000000) + $diffmicro)/1000000); 

    //Creates the variable that will hold the seconds (?): 
    $difference = $sec . "." . str_pad($micro,6,'0'); 

    return $difference; 
} 

Эта функция возвращает корректные разницу

Example: 
    Start:"2016-10-27 17:17:52.576801" 
    End:"2016-10-27 17:18:00.385801" 
    Difference:"7.809000" 

    Old Function: 
    Difference:"8.191000"