Форматирование PHP time() из таблицы MySQL
-
14-09-2020 - |
Вопрос
Я создаю комментарии, хранящиеся в базе данных 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
Пример вывода на моем сервере:
Случайный комментарий
Это самый крутой комментарий!!!!
-Кайл
1278905319
Как я могу преобразовать время «1278905319» в читаемый формат, например «опубликовано 4 секунды назад» или что-то в этом роде, которое имеет дело с секундами, минутами, часами, днями, неделями, месяцами, годами?
Является ли PHP неправильным способом сделать это?Я читал о временных метках MySQL, но не понимаю ни этого, ни того, как заставить это работать в моем случае.
Итак, мой главный вопрос: как отформатировать время в читаемое время на выходе.«2 секунды назад»
Спасибо."="
Решение
Вот функция, которую я нашел Здесь , написанный одним Джоном McClumpha:
.<?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;
}
. Другие советы
Во-первых, позвольте 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 (требуется 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
Вы можете отформатировать интервал так, как вам нравится, используя ДатаИнтервал::формат параметры.Заставив MySQL вернуться NOW()
, вы гарантируете, что не будет никаких расхождений во времени между вашим сервером приложений (тот, на котором работает PHP) и сервером базы данных.
Если вам нужны комплексные расчеты времени, проверьте DateHehelper 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, например.