2013-09-17 2 views
0

Мне нужно преобразовать DateTime в год, месяц, дни, часы, минуты, секунды назад, как в случае заданного вопроса yahoo 5week назад, или 1 год назад или 1 месяц назад, моя дата сохраняется в база данных: 2011-11-30 05:25:50.Convert datetime in time ago

Теперь я хочу показать, как год, месяц, дни, часы, минуты и секунды в PHP: how much year, how many months , days, hours, minutes, seconds назад, но нужно только однострочное показ, как будто это будет год или дни, часы или минуты или секунды.

Я искал об этом, но не понимаю, как я могу это сделать. Я знаю, что в этой теме есть много вопросов, возможно, это дубликат, но я не могу решить свою проблему.

Заранее спасибо.

+0

Вы не можете преобразовать даты в период времени. Для этого вам нужны ** две ** даты. –

+2

Вы хотите разницу между тем временем и теперь, я полагаю? http://www.php.net/manual/en/datetime.diff.php – CBroe

+0

Нет, я не хочу разницы –

ответ

3

Предполагая, что вы имеете в виду по отношению к подарку (если вы этого не сделаете, пожалуйста, уточнить ваш вопрос), вы можете использовать это:

$then = new DateTime('2011-11-30 05:25:50'); 
$now = new DateTime(); 
$delta = $now->diff($then); 

$quantities = array(
    'year' => $delta->y, 
    'month' => $delta->m, 
    'day' => $delta->d, 
    'hour' => $delta->h, 
    'minute' => $delta->i, 
    'second' => $delta->s); 

$str = ''; 
foreach($quantities as $unit => $value) { 
    if($value == 0) continue; 
    $str .= $value . ' ' . $unit; 
    if($value != 1) { 
     $str .= 's'; 
    } 
    $str .= ', '; 
} 
$str = $str == '' ? 'a moment ' : substr($str, 0, -2); 

echo $str; 

Выход:

1 year, 9 months, 17 days, 14 hours, 31 minutes, 31 seconds 
+0

Они выяснили, что нет. [См. Этот ответ] (http://stackoverflow.com/questions/18787790/difference-between-2-time-values/18787809#18787809) для более сжатого способа сделать это. –

+0

У меня есть таблица вопросов есть save ask_date 2011-11-30 05:25:50 сейчас я хочу показать этот вопрос был задан «год, месяц, дни, часы, минуты, секунды назад –

+2

Получить эту метку времени из базы данных в normal way, поместите '$ result ['ask_date']' в конструктор первого 'DateTime' (' $ then') и добавьте 'ago' в окончательную' $ str'. –

0

Попробуйте это: http://www.php.net/manual/en/function.strtotime.php

PHP имеет хорошую функцию strtotime все готово для ваших нужд.

Это даст вам временную метку, тогда вы можете просто делать математику оттуда с любой даты, из которой вы вычитаете.

+0

Но все, они * не * делают математику на двух разных датах. –

+0

Я сделал предположение, что у них было второе свидание, готовое к работе. Тем не менее, вы можете конвертировать одну дату в такую ​​строку, если хотите что-то вроде '2011 года, 11 месяцев, 30 дней, 5 часов, 25 минут, 50 секунд' – Esaevian

+0

Hmph, nevermind, я просто видел комментарий ali. Теперь этот вопрос не имеет смысла. – Esaevian

0

Вы можете попробовать расщепить это, используя preg_split.

Try что-то вроде

$output = preg_split("/ (-| |:) /", $input); 

Это должно дать вам массив, где первый элемент обозначает год, второе это месяц, и так далее.

2

Я всегда использовал эту функцию:

function when($datetime) { 

    define("SECOND", 1); 
    define("MINUTE", 60 * SECOND); 
    define("HOUR", 60 * MINUTE); define("DAY", 24 * HOUR); 
    define("MONTH", 30 * DAY); $delta = time() - strtotime($datetime); 

    // convert 

    if($delta < 1 * MINUTE) { return $delta == 1 ? "one second ago" : $delta." seconds ago"; } 
    if($delta < 2 * MINUTE) { return "a minute ago"; } if($delta < 45 * MINUTE) { return floor($delta/MINUTE)." minutes ago"; } 
    if($delta < 90 * MINUTE) { return "an hour ago"; } if($delta < 24 * HOUR) { return floor($delta/HOUR)." hours ago"; } 
    if($delta < 48 * HOUR) { return "yesterday"; } if($delta < 30 * DAY) { return floor($delta/DAY)." days ago"; } 
    if($delta < 12 * MONTH) { $months = floor($delta/DAY/30); return $months <= 1 ? "one month ago" : $months." months ago"; } 
    else { $years = floor($delta/DAY/365); return $years <= 1 ? "one year ago" : $years." years ago"; } 

} 

эхо, когда (ВАША ДАТА ЗДЕСЬ) вернёт наилучший формат относительного времени, которые могут быть дни, часы, или если это было не так давно назад, даже в секундах.

+0

Они не хотят разницы между двумя датами –

+0

Я с @ Эсаевым, тогда этот вопрос не имеет смысла. –

+0

Спасибо, я использовал ваш метод, и он повторяет эту ошибку: Константа SECOND уже определена: я использую эту функцию в классе модели yii –