Сценарий: запись была введена в базу данных.
Я пытаюсь выяснить следующие уравнения:
Учитывая эти моменты:
Я чувствую, что нахожусь на правильном пути. Нужна ли какая-то правильная математика для расчетов? Я ужасен по математике. Любая помощь или руководство будут оценены. Я не ищу, чтобы кто-то ЗАПОЛНИЛ ЭТО ДЛЯ МЕНЯ. Просто ищите советы о том, что я делаю неправильно, или как я могу сделать это лучше. Возможно, объясните математические формулы, необходимые для достижения моей цели.
Вот что я имею до сих пор:
class tools{ public function __construct(){ } public function check_time($time, $request){ $time = strtotime($time); if($request == 'since'){ $theTime = time() - $time; $prefix = 'Since:'; } elseif($request == 'until'){ $midnight = mktime(0, 0, 0, date('n'), date('j'), date('Y')); $theTime = $midnight - $time; $prefix = 'Until:'; } $tokens = array ( 31536000 => 'year', 2592000 => 'month', 604800 => 'week', 86400 => 'day', 3600 => 'hour', 60 => 'minute', 1 => 'second' ); foreach($tokens as $unit => $text){ if($theTime < $unit) continue; $duration = floor($theTime / $unit); return $prefix.' '.$duration.' '.$text.(($duration>1)?'s':''); } } }// EoF tools class $tools = new tools(); print_r($tools->check_time('2012-08-22 20:11:20', 'since')); print_r($tools->check_time('2012-08-22 20:11:20', 'until'));
Решение здесь очень простое. Существует незначительная ошибка, которая вызывает все ваши проблемы.
В вашем коде у вас есть это, чтобы рассчитать полночь.
$midnight = mktime(0, 0, 0, date('n'), date('j'), date('Y'));
Это неверно для простого факта, что он использует полночь СЕГОДНЯ (что было бы 00:00 сегодня, однако много часов назад с этого момента. Вы хотите полночь ЗАВТРА, так как это считается 00:00 в 24 часа и завтра. способ сделать это просто так:
$midnight = strtotime("tomorrow 00:00:00");
Просто имейте в виду, что strtotime () основывает все на GMT, поэтому убедитесь, что вы установили часовой пояс по умолчанию в файле / приложении.
Надеюсь, мой ответ ясен и объясняет, почему код, который вы опубликовали, является неправильным и как его исправить.
Может, что-то вроде этого? Я должен признать, что не совсем понимаю, что ваш желаемый результат:
$d1 = new DateTime('2012-08-22 20:11:20'); $d2 = new DateTime('2012-08-23 00:00:00'); $interval = $d1->diff($d2); echo $interval->format('%h hours %i minutes and %s seconds');
полночь не больше, чем на следующий день без указания времени, лучший способ сделать это должен быть:
<?php $datetime1 = new DateTime(date('Ymd H:i:s'));//current datetime object $datetime2 = new DateTime(date('Ym-').date(d));//next day at midnight $interval = $datetime1->diff($datetime2);//diference echo $interval->format('H');printing only hours (same as date format) ?>
если вы хотите узнать больше: php date_diff
Вы можете попробовать следующее:
$now = strtotime('2012-08-22 20:11:20'); $midnight = strtotime('2012-08-23 00:00:00'); $difference = $midnight - $now; echo date("H:i:s", $difference);