2013-09-18 2 views
1

Я хочу конвертировать даты() в «» лет/месяцев/недель/дней/часов/минут/секунд назад. Как мне это сделать?PHP Преобразование даты в «пустые» дни/часы/секунды назад

В настоящее время я использую date('M j, Y') при сохранении даты в базе данных. Есть ли более эффективный способ сохранить дату для того, что я хочу создать выше?

(Мой сайт не живут, так что я могу делать все, что нужно в базе данных и кода в случае необходимости)

+0

http://stackoverflow.com/a/18602474/67332 –

ответ

3

Вы должны всегда сохранять даты в формате даты и времени в MySQL (YYYY-MM-DD). Это позволяет вам легко использовать встроенные функции MySQL. Хранение его в любом другом формате означает (потенциально много) больше работы для вас, когда вы хотите сделать больше, а затем просто отображать эти значения.

Чтобы сделать то, что вы хотите сделать с PHP вы DateTime() (на основе this answer):

$datetime1 = new DateTime($firstDate); 
$datetime2 = new DateTime($secondDate); 
$interval = $datetime1->diff($datetime2); 
if ($interval->days <= 7) 
{ 
    $elapsed = $interval->format('%y years, %m months, %a days, %h hours, %i minutes, %S seconds'); 
    $elapsed = str_replace(array('0 years,', ' 0 months,', ' 0 days,', ' 0 hours,', ' 0 minutes,'), '', $elapsed); 
    $elapsed = str_replace(array('1 years, ', ' 1 months, ', ' 1 days, ', ' 1 hours, ', ' 1 minutes'), array('1 year, ', '1 month, ', ' 1 day, ', ' 1 hour, ', ' 1 minute'), $elapsed); 
    echo $elapsed; 
} 
else 
{ 
    echo $firstDate; 
} 

$datetime1 = new DateTime($firstDate); 
$datetime2 = new DateTime($secondDate); 

Эти линии создают DateTime() объекты с соответствующими датами.

$interval = $datetime1->diff($datetime2); 

Эти линии вычитают вторую дату первого и возвращает разницу в качестве DateInterval() объекта.

if ($interval->days > 7) 

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

$elapsed = $interval->format('%y years, %m months, %a days, %h hours, %i minutes, %S seconds'); 
$elapsed = str_replace(array('0 years,', ' 0 months,', ' 0 days,', ' 0 hours,', ' 0 minutes,'), '', $elapsed); 
$elapsed = str_replace(array('1 years, ', ' 1 months, ', ' 1 days, ', ' 1 hours, ', ' 1 minutes'), array('1 year, ', '1 month, ', ' 1 day, ', ' 1 hour, ', ' 1 minute'), $elapsed); 
echo $elapsed; 

Этот блок кода просто принимает разницу дат между двумя датами (а DateInterval() объекта) и форматирует его в формате, который вы просили. Во вторых строках удаляются любые периоды времени, которые не имеют значений (т. Е. 0 месяцев) и удаляют их из строки. Третья строка принимает любые периоды с одним значением (т. Е. 1 месяц) и обрезает ненужные 's' в конце (т.е. 1 месяц становится 1 месяцем).

+0

Спасибо. Вы можете быстро объяснить код? Я новичок в php, это очень помогло бы мне. Благодаря! – Anthony

+0

@ Энтони Пояснение добавлено –

+0

Большое спасибо. Однако мой формат должен был быть как Ex. 35 секунд назад. ИЛИ 15 минут назад. ИЛИ 2 дня назад. ИЛИ 1 месяц назад ИЛИ 1 год назад. Ваш код дал год, дни и секунды. У меня есть цель, которую я предполагаю, но это не совсем то, что я искал. – Anthony

Смежные вопросы