Временная метка в моей базе данных 2015-03-03 00:25:39
(Обратите внимание, что type = timestamp
и правильная текущая метка времени в моем конце 2015-03-02 01:31:00
, Разница должна быть около 23 часов. Но теперь проблема в том, что ответы, предоставленные в сети, дадут мне 30 часов вместо 23 часов. Вот некоторые из кодов, которые я пробовал:
$target
является целевой датой
CODE 1:
$then = strtotime($target);
$diff = $then - time();
echo sprintf("%s days and %s hours left", date('z', $diff), date('G', $diff));
Но это дает мне 1 день и 6 часов осталось. Так 30 hours
CODE2:
$seconds = strtotime("$target") - time();
echo $seconds; exit();
$days = floor($seconds / 86400);
$seconds %= 86400;
$hours = floor($seconds / 3600);
echo $hours;
Это дает мне что-то вроде 107388
= 30 часов
CODE 3:
//Convert to date
$datestr= $target;//Your date
$date=strtotime($datestr);//Converted to a PHP date (a second count)
//Calculate difference
$diff=$date-time();//time returns current time in seconds
$days=floor($diff/(60*60*24));//seconds/minute*minutes/hour*hours/day)
$hours=round(($diff-$days*60*60*24)/(60*60));
Это дает мне 6 часов
Я не знаю, что я делаю неправильно, скорее я понятия не имею, как это сделать.
Теперь это мое последнее средство, так как я не могу найти решение, которое мне поможет.
Надеемся на ваши быстрые ответы.
РНР DateTime()
(а также DateInterval()
) намного лучше для математики даты и возвращает правильные результаты:
$date = new DateTime('2015-03-03 00:25:39');
$now = new DateTime('2015-03-02 01:31:00');
$diff = $date->diff($now);
echo $diff->h, ' hours ', $diff->i, ' minutes';
Это очень поздний ответ, но ваш вопрос — хороший, который, скорее всего, будет искать в будущем.
Вот онлайн демо.
// this doesn't appreciate any timezone declarations, you'll need to add this if necessary
$target="2015-03-03 00:25:39"; // declare your input
$then=new DateTime($target); // feed input to DateTime
$now=new DateTime(); // get DateTime for Now
$diff=(array)$then->diff($now); // calculate difference & cast as array
$labels=array("y"=>"year","m"=>"month","d"=>"day","h"=>"hour","i"=>"minute","s"=>"second");
$readable=""; // declare as empty string
// filter the $diff array to only include the desired elements and loop
foreach(array_intersect_key($diff,$labels) as $k=>$v){
if($v>0){ // only add non-zero values to $readable
$readable.=($readable!=""?", ":"")."$v {$labels[$k]}".($v>1?"s":"");
// use comma-space as glue | show value | show unit | pluralize when necessary
}
}
echo "$readable";
// e.g. 2 years, 20 days, 1 hour, 10 minutes, 40 seconds