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.=)

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top