Преобразование формата datetime из Mysql в более удобный формат, например: «3 дня 12 часов назад»

#php

#php

Вопрос:

у меня есть некоторые даты, восстановленные с помощью php с моего сервера mysql в обычном формате: 2011-05-13 12: 22: 11, как я могу преобразовать это в: 3 дня и 12 часов назад. Большое спасибо!

Комментарии:

1. tutorialzine.com/2009/09/making-our-own-twitter-timeline прокрутите вниз до functions.php вы найдете функцию относительного времени.

2. Существует базиллион ошибок в этом вопросе. Просмотрите «связанный» список, который находится в ответах на этот вопрос (и который, кстати, появился, когда вы его писали).

Ответ №1:

За ваши проблемы (источник) — Интернет потрясающий:

 /* takes an argument in unix time (seconds) */
function time_since($original) {
    // array of time period chunks
    $chunks = array(
        array(60 * 60 * 24 * 365 , 'year'),
        array(60 * 60 * 24 * 30 , 'month'),
        array(60 * 60 * 24 * 7, 'week'),
        array(60 * 60 * 24 , 'day'),
        array(60 * 60 , 'hour'),
        array(60 , 'minute'),
    );

    $today = time(); /* Current unix time  */
    $since = $today - $original;

    // $j saves performing the count function each time around the loop
    for ($i = 0, $j = count($chunks); $i < $j; $i  ) {

        $seconds = $chunks[$i][0];
        $name = $chunks[$i][1];

        // finding the biggest chunk (if the chunk fits, break)
        if (($count = floor($since / $seconds)) != 0) {
            // DEBUG print "<!-- It's $name -->n";
            break;
        }
    }

    $print = ($count == 1) ? '1 '.$name : "$count {$name}s";

    if ($i   1 < $j) {
        // now getting the second item
        $seconds2 = $chunks[$i   1][0];
        $name2 = $chunks[$i   1][1];

        // add second item if it's greater than 0
        if (($count2 = floor(($since - ($seconds * $count)) / $seconds2)) != 0) {
            $print .= ($count2 == 1) ? ', 1 '.$name2 : ", $count2 {$name2}s";
        }
    }
    return $print;
}

echo time_since(strtotime('2011-05-13 12:22:11')); // 1 day, 2 hours
  

Ответ №2:

Вы можете разбить его на массивы, а затем использовать функцию mktime, чтобы вручную восстановить временную метку, которую может распознать PHP.

 $str = "2011-05-13 12:22:11";

//Seperate the Date and Time components into an array
$detail_array = explode(" ", $str);

//Seperate each the Year, Month and Day
$date_array = explode("-", $detail_array[0]);

//Seperate the Hour, Minute and Second
$time_array = explode(":", $detail_array[1]);

//Recompile the components into the correct order to produce a timestamp
$timestamp = mktime($time_array[0], $time_array[1], $time_array[2], $date_array[1], $date_array[2], $date_array[0]);

//Confirm the timestamp produces the original string
echo "Timestamp Test: " . date("Y-m-d h:i:s", $timestamp) . "<br />";

//Determine how long ago the timestamp was in seconds
$age = time() - $timestamp;

$days_old = round($age / 86400, 0);

$hours_old = round(($age - ($days_old * 86400)) / 3600, 0);

echo "$days_old day/s and $hours_old hour/s ago";
  

Ответ №3:

Это может быть полезно для вас, «Удобные временные фразы в PHP».

http://danlamanna.com/portfolio/?p=51

Ответ №4:

Вам нужно будет вычесть эту дату из текущей даты.

Используйте DateTime::diff для этой цели. Это вернет вам объект DateInterval, который вы можете легко преобразовать в форму, в которой вы хотите его представить.