Пока что я пытаюсь получить процент времени, оставшегося между двумя датами, чтобы я мог использовать индикатор выполнения ..
У меня есть следующий код, я передаю две даты и делаю сумму, но я получаю ошибку. Я не уверен, если эта ошибка из-за формата даты, если так, я могу изменить его.
<?
$start = '2015-11-03 14:05:15';
$end = '2015-11-03 18:05:15';
$current = '2015-11-03 16:12:15';
$completed = (($current - $start) / ($end - $start)) * 100;
?>
<? print $completed; ?>
Я получаю следующую ошибку.
Предупреждение: деление на ноль
strtotime возьмет строку даты и превратит ее в стандартное время Unix в виде секунд.
<?
$start = strtotime('2015-11-03 14:05:15');
$end = strtotime('2015-11-03 18:05:15');
$current = strtotime('2015-11-03 16:12:15');
$completed = (($current - $start) / ($end - $start)) * 100;
?>
<? print $completed; ?>
Это строки. Вы не можете вычесть строки и ожидать, что все будет работать. Что происходит, это:
$start = '2015-11-03 14:05:15';
$end = '2015-11-03 18:05:15';
Так как вы делаете -
PHP преобразует эти строки в целые числа:
$new_start = (int)$start; // 2015
$new_end = (int)$end; // 2015
$new_end - $new_start -> 0
Вам нужно strtotime()
эти значения обратно в метку времени Unix, а затем вы МОЖНО вычтите эти значения и получите разницу в секундах.
Я бы порекомендовал использовать объект DateTime в течение strtotime. DateTime позволяет вам указать формат, который создает временную метку, вместо того, чтобы полагаться на strtotime, чтобы волшебным образом выяснить это. Это делает его гораздо более надежным.
Например:
<?php
$start = DateTime::createFromFormat('Y-m-d H:i:s', '2015-11-03 14:05:15');
$end = DateTime::createFromFormat('Y-m-d H:i:s', '2015-11-03 18:05:15');
$current = DateTime::createFromFormat('Y-m-d H:i:s', '2015-11-03 16:12:15');
$completed = (($current->getTimestamp() - $start->getTimestamp()) / ($end->getTimestamp() - $start->getTimestamp())) * 100;
echo $completed;
?>
Примечание: объекты DateTime были введены в PHP 5.3. Любые старые версии не будут иметь DateTime. (и, честно говоря, должно быть обновлено по многим причинам)
Вы используете строки (в основном, простой текст) … Так что вы ничего не можете рассчитать.
Для этого вы должны использовать временные метки (миллисекунды с начала 1970 года)
http://php.net/manual/fr/function.strtotime.php
$start = strtotime('2015-11-03 14:05:15');
$end = strtotime('2015-11-03 18:05:15');
$current = strtotime('2015-11-03 16:12:15');