У меня есть такая функция:
function time_elapsed_string($ptime) { $date_time = strtotime("1348-10-10 04:30:01") + $ptime; $year = date("Y",$date_time); $month = date("m",$date_time); $day = date("d",$date_time); $time = date("H:i:s",$date_time); $etime = time() - $ptime + 1; $a = array( 31536000 => 'year', 2592000 => 'month', 86400 => 'day', 3600 => 'hour', 60 => 'minute', 1 => 'second' ); foreach ($a as $secs => $str) { $d = $etime / $secs; if ($d >= 1) { $r = round($d); // EX: return array('date' => $day.'-'.$month.'-'.$year, // 2016-02-20 'time' => $time, // 03:30:04 'difference' => $r . ' ' . $str . ' ago' // 2 month ago ); } } }
И я использую его вот так:
$ptime = 1470692661; $html = '<span title="date: '.time_elapsed_string($ptime)['date'].' time: '.time_elapsed_string($ptime)['time'].'">in '.time_elapsed_string($ptime)['difference'].'<span>';
Как вы видите, я использую результат этой функции следующим образом:
time_elapsed_string($ptime)['date'] ime_elapsed_string($ptime)['time'] time_elapsed_string($ptime)['difference']
Фактически я называю эту функцию каждый раз, когда мне нужен один из ее результатов. Это правильно? Или я должен его вызвать один раз и сохранить в массиве?
Примечание. Мой код также работает.
Время отсчета, прошедшее с той или иной даты / времени, как это, является mauvais ton .
DateTime
доступен с PHP 5.2.0, а тонны людей недооценивают его. Почему бы вам не использовать это вместо loop
s и if
s?
$create_time = "2016-08-02 12:35:04"; $current_time="2016-08-02 16:16:02"; $dtCurrent = DateTime::createFromFormat('Ymd H:i:s', $current_time); // to use current timestamp, use the following: //$dtCurrent = new DateTime(); $dtCreate = DateTime::createFromFormat('Ymd H:i:s', $create_time); $diff = $dtCurrent->diff($dtCreate);
Теперь вы можете отформатировать результат, но хотите:
$interval = $diff->format("%h hours %i minutes %s seconds");
Это даст чистые 3 hours 40 minutes 58 seconds
без каких-либо массивов, что лучше.
ОБНОВИТЬ
Существует общее решение для получения часов / минут / секунд через регулярное выражение:
$interval = $diff->format("%y years %m months %d days %h hours %i minutes %s seconds"); // now remove zero values $interval = preg_replace('/(^0| 0) (years|months|days|hours|minutes|seconds)/', '', $interval);
ОБНОВЛЕНИЕ 2
На ваш комментарий:
Послушайте, я хочу использовать ваш подход .. но я действительно не могу его реализовать .. На самом деле мне нужны три вещи:
time
,date
,difference
..! Но ваш подход не дает мне их.
Ну, мы уже знаем, как получить разницу, это переменная $interval
описанная выше.
Чтобы получить время и дату, вы можете получить его из переменной $dtCreate
, опять же, используя формат:
$time = $dtCreate->format('H:i:s'); $date = $dtCreate->format('dm-Y');
Это не проблема.
Да – сохранить результат вызова функции time_elapsed_string($ptime)
в массиве, а затем использовать это для доступа к вашим результатам. Вы теряете процессорные циклы в противном случае!
// call it once $result = time_elapsed_string($ptime); // then use: $result['date']; $result['time']; $result['difference'];