Formatage de l'heure PHP() à partir de la table MySQL
-
14-09-2020 - |
Question
Je crée des commentaires stockés dans une base de données MySQL.
J'enregistre la fonction time de php time()
au fur et à mesure que le commentaire est publié.De cette façon, il affiche un message tel que..."commentaire...posté il y a 4 secondes" et si j'actualise la page 2 minutes plus tard, elle affichera "commentaire...posté il y a 2 minutes"
Voici comment j'entre time()
dans la base de données avec les autres données :
$date=time();
// Insert data into mysql
$sql="INSERT INTO testimonials (username, comment, date)
VALUES ('$username', '$comment', '$date')";
Maintenant...Je récupère les données comme ceci :
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
L'exemple de sortie sur mon serveur est :
Commentaire aléatoire
C'est le commentaire le plus génial qui soit !!!!
-Kyle
1278905319
Comment puis-je convertir l'heure « 1278905319 » dans un format lisible tel que « publié il y a 4 secondes » ou quelque chose qui traite des secondes, minutes, heures, jours, semaines, mois, années ?
PHP est-il la mauvaise façon de procéder ?J'ai lu des articles sur l'horodatage MySQL mais je ne comprends pas cela ni comment le faire fonctionner dans mon cas.
Ma principale question est donc de savoir comment formater l'heure en une heure lisible en sortie."il y a 2 secondes"
Merci.=)
La solution
Voici une fonction que j'ai trouvée ici, écrit par un certain John 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;
}
Autres conseils
Tout d’abord, laissez MySQL insérer la date pour vous en utilisant un champ d’horodatage à mise à jour automatique :
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;
De cette façon, vous n'avez pas à vous soucier d'insérer la date à partir de votre code PHP, et si vous effectuez des tests depuis ailleurs - depuis le client MySQL, par exemple, la date sera toujours insérée correctement.
Vous devriez également utiliser le Classe PHP DateTime (nécessite PHP 5.3.0 ou supérieur), car cela rend le travail avec les dates et les heures assez simple.Voici un exemple d'obtention d'informations de la base de données et de renvoi d'un intervalle de temps formaté :
$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
Vous pouvez formater l'intervalle comme bon vous semble en utilisant le DateIntervalle ::format paramètres.En faisant revenir MySQL NOW()
, vous vous assurez que tout décalage horaire entre votre serveur d'applications (celui exécutant PHP) et votre serveur de base de données est évité.
Si vous avez besoin de calculs de temps complexes, consultez DateHelper de symfony, en particulier distance_of_time_in_words
comme on le trouve dans le source.Il s'agit d'une méthode très puissante qui connaît un calcul de temps très fin (par ex.il y a 5 secondes, il y a 20 secondes, il y a environ 1 minute, il y a 10 minutes,...)
Si vous voulez juste avoir le date formatée, vous pouvez le formater via MySQL :
SELECT your_fields, FROM_UNIXTIME(date, 'H:%i:%s') FROM table;
vous donnerait 12:24:59 par exemple.