Вычислить разницу между датой/временем в PHP
У меня есть объект Date (from Pear) и вы хотите вычесть другой объект Date, чтобы получить разницу во времени в секундах.
Я пробовал несколько вещей, но первый просто дал мне разницу в днях, а второй позволил мне преобразовать одно фиксированное время в временную метку unix, но не объект Date.
$now = new Date();
$tzone = new Date_TimeZone($timezone);
$now->convertTZ($tzone);
$start = strtotime($now);
$eob = strtotime("2009/07/02 17:00"); // Always today at 17:00
$timediff = $eob - $start;
** Примечание ** Это будет всегда меньше чем 24-часовая разница.
Ответы
Ответ 1
Все еще дал несколько неправильных значений, но учитывая, что у меня есть старая версия PEAR Date around, возможно, она работает для вас или дает вам подсказку о том, как исправить:)
<pre>
<?php
require "Date.php";
$now = new Date();
$target = new Date("2009-07-02 15:00:00");
//Bring target to current timezone to compare. (From Hawaii to GMT)
$target->setTZByID("US/Hawaii");
$target->convertTZByID("America/Sao_Paulo");
$diff = new Date_Span($target,$now);
echo "Now (localtime): {$now->format("%Y-%m-%d %H:%M:%S")} \n\n";
echo "Target (localtime): {$target->format("%Y-%m-%d %H:%M:%S")} \n\n";
echo $diff->format("Diff: %g seconds => %C");
?>
</pre>
Ответ 2
Вы уверены, что преобразование объекта Pear Date → string → timestamp будет работать надежно? Вот что делается здесь:
$start = strtotime($now);
В качестве альтернативы вы можете получить такую временную метку в соответствии с документацией
$start = $now->getTime();
Ответ 3
Чтобы сделать это без груши, чтобы найти секунды до 17:00, вы можете сделать:
$current_time = mktime ();
$target_time = strtotime (date ('Y-m-d'. ' 17:00:00'));
$timediff = $target_time - $current_time;
Не тестировал его, но он должен делать то, что вам нужно.
Ответ 4
Я не думаю, что вы должны передавать весь объект Date в strtotime. Вместо этого используйте один из них:
$start = strtotime($now->getDate());
или
$start = $now->getTime();
Ответ 5
Возможно, некоторые люди хотят иметь разницу во времени способом facebook. Он говорит вам "минуту назад", или "2 дня назад" и т.д. Вот мой код:
function getTimeDifferenceToNowString($timeToCompare) {
// get current time
$currentTime = new Date();
$currentTimeInSeconds = strtotime($currentTime);
$timeToCompareInSeconds = strtotime($timeToCompare);
// get delta between $time and $currentTime
$delta = $currentTimeInSeconds - $timeToCompareInSeconds;
// if delta is more than 7 days print the date
if ($delta > 60 * 60 * 24 *7 ) {
return $timeToCompare;
}
// if delta is more than 24 hours print in days
else if ($delta > 60 * 60 *24) {
$days = $delta / (60*60 *24);
return $days . " days ago";
}
// if delta is more than 60 minutes, print in hours
else if ($delta > 60 * 60){
$hours = $delta / (60*60);
return $hours . " hours ago";
}
// if delta is more than 60 seconds print in minutes
else if ($delta > 60) {
$minutes = $delta / 60;
return $minutes . " minutes ago";
}
// actually for now: if it is less or equal to 60 seconds, just say it is a minute
return "one minute ago";
}