Форматирование PHP time () из таблицы MySQL - PullRequest
1 голос
/ 12 июля 2010

Я создаю комментарии, хранящиеся в базе данных MySQL.

Я регистрирую функцию времени php time(), когда комментарий опубликован. Таким образом, оно отображает сообщение, такое как ... "комментарий ... опубликовано 4 секунды назад", и если я обновлю страницу через 2 минуты, оно будет отображать "комментарий ... опубликовано 2 минуты назад" *

Вот как я ввожу time() в базу данных вместе с другими данными:

$date=time();

// Insert data into mysql
$sql="INSERT INTO testimonials (username, comment, date) 
  VALUES ('$username', '$comment', '$date')";

Теперь ... я беру данные вот так:

while ($row = mysql_fetch_row($result) )
{
  echo "<b>Random Comment</b></br>";
  echo ("<p>\n> $row[1]"); //comment
  echo ("</br>-$row[0]</p>"); //name
  echo ("</br>$row[2]"); //date

Пример вывода на моем сервере:

Случайный комментарий

Это самый потрясающий комментарий когда-либо !!!!

-Kyle

1278905319

Как я могу преобразовать время "1278905319" в читаемый формат, такой как "опубликовано 4 секунды назад" или что-то, что связано с секундами, минутами, часами, днями, неделями, месяцами, годами?

Является ли PHP неправильным способом сделать это? Я читал о метках времени MySQL, но я не понимаю, как и как заставить это работать в моем случае.

Итак, мой главный вопрос - как отформатировать время в удобочитаемое время на выходе. "2 секунды назад"

Спасибо. =) * * Тысяча тридцать одна

Ответы [ 3 ]

1 голос
/ 12 июля 2010

Во-первых, позвольте MySQL вставить для вас дату, используя поле автообновления отметки времени:

CREATE TABLE `table_a` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` VARCHAR(255),
  `comment` TEXT,
  `date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;

Таким образом, вам не нужно беспокоиться о вставке даты из вашего PHP-кода, и если вы проводите какое-либо тестирование из другого места - например, из клиента MySQL, дата все равно будет вставлена ​​правильно.

Вам также следует использовать PHP DateTime Class (требуется PHP 5.3.0 или выше), поскольку это упрощает работу с датами и временем. Вот пример получения некоторой информации из базы данных и возврата отформатированного временного интервала:

$result = $mysqli->query(
    'SELECT ' .
    '`id`, ' .
    '`username`, ' .
    '`comment`, ' .
    '`date`, ' .
    'NOW(), ' .
    'FROM table');

$row = $result->fetch_assoc();

print_r($row);
Array
(
    [id] => 1
    [username] = 'Fred'
    [comment] = 'My first post'
    [date] => 2009-09-28 07:08:12
    [now] => 2010-07-12 08:47:03
)

$now = new DateTime($row['now']);
$post = new DateTime($row['date']);
$interval = $post->diff($now);
echo $interval->format('%m months, %d days, %d days, %h hours, %m minutes, %s seconds');

// 9 months, 14 days, 14 days, 1 hours, 9 minutes, 51 seconds

Вы можете отформатировать интервал по своему усмотрению, используя параметры DateInterval :: format . Получая MySQL для возврата NOW(), вы гарантируете, что любое несоответствие времени между вашим сервером приложений (тот, на котором работает PHP) и вашим сервером базы данных исключается.

0 голосов
/ 12 июля 2010

Если вам нужны сложные расчеты времени, посмотрите DateHelper Symfony, особенно distance_of_time_in_words, как указано в источнике . Это очень мощный метод, который знает очень точный расчет времени (например, 5 секунд назад, 20 секунд назад, около 1 минуты назад, 10 минут назад, ...)


Если вы просто хотите отформатировать дату , вы можете отформатировать ее через MySQL:

SELECT your_fields, FROM_UNIXTIME(date, 'H:%i:%s') FROM table;

даст вам 12:24:59, например.

0 голосов
/ 12 июля 2010

Вот функция, которую я нашел здесь , написанный одним Джоном МакКлюмфой:

<?php
function RelativeTime($timestamp){
    $difference = time() - $timestamp;
    $periods = array("sec", "min", "hour", "day", "week", "month", "years", "decade");
    $lengths = array("60","60","24","7","4.35","12","10");

    if ($difference > 0) { // this was in the past
        $ending = "ago";
    } else { // this was in the future
        $difference = -$difference;
        $ending = "to go";
    }       
    for($j = 0; $difference >= $lengths[$j]; $j++) $difference /= $lengths[$j];
    $difference = round($difference);
    if($difference != 1) $periods[$j].= "s";
    $text = "$difference $periods[$j] $ending";
    return $text;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...