2010-07-02 5 views
1

Donc, en ce moment, je sélectionne actuellement un Timestamp depuis ma base de données MySQL. Dans la base de données, l'horodatage ressemble à ceci:Rendre un Timestamp PHP/MySQL plus attrayant

2010-06-30 12:36:08

Il est évident que pour une webapp, ce n'est pas très attrayant pour les utilisateurs de voir. Donc, en utilisant certaines fonctions de CodeIgniter, je l'ai fait paraître un peu plus agréable.

<h4 class="timestamp"> 
    <?php // Quickly calculate the timespan 
    $post_date = mysql_to_unix($row->date); 
    $now = time(); 
    echo timespan($post_date, $now);?> ago 
</h4> 

Si vous ne faites pas CodeIgniter, PHP standard de tout, sauf pour echo timespan(). CodeIgniter ne fait qu'appeler cela comme un 'temps anglais'. Ainsi, un exemple de sortie serait:

2 Months, 4 Weeks, 5 Hours, 20 Minutes ago

C'est bien beau, mais je veux le faire paraître plus agréable quand même ... il y a trop de virgules et son tout un peu trop longtemps (je sais, je suis difficile ...). Ce que je comme est:

  1. Si le timespan est moins d'un jour vieux, la sortie devrait être 7 hours, 33 minutes ago
  2. Si le timespan est moins d'une semaine, la sortie devrait être 4 days ago
  3. Si la timespan est inférieure à un mois, la sortie devrait être 2 weeks, 6 days ago
  4. Si le timespan est plus d'un mois, la sortie devrait être 4 months ago
  5. Dans le cas éventuel du timespan être plus d'un an, la sortie devrait être Over a year ago

Comme vous pouvez le voir, je suis actuellement en utilisant une fonction de CodeIgniter pour simplifier - mais s'il y a une fonction PHP native qui peut faire ce que je veux qu'il, ça va être génial.

Merci pour votre aide!

Jack

+0

Pas que je sache. Créez simplement vous-même une fonction utilitaire personnalisée pour cela (CI d'aide ou quelque chose dans le CI) –

Répondre

6

Ceci est mieux fait sur le côté client dans la couche de présentation. Voici une solution JS:

Timeago est un plugin jQuery qui le rend facile à soutenir la mise à jour automatique horodatages floue (par exemple « il y a 4 minutes » ou « il y a environ 1 jour »).

Timeago tournera tous les éléments abbr avec un class de timeago et un horodatage ISO 8601 dans le title:

<abbr class="timeago" title="2008-07-17T09:24:17Z">July 17, 2008</abbr> 

en quelque chose comme ceci:

<abbr class="timeago" title="July 17, 2008">about a year ago</abbr> 

Pour convertir la date dans le Format ISO 8601, vous pouvez faire quelque chose comme ceci:

<?= date("c", $post_date) ?> 

Exemples:

Vous avez ouvert cette page il y a moins de minute. (Cela mettra à jour toutes les minutes Attendez-le.)

Cette page a été modifiée il ya 11 jours .

Ryan est né il y a 31 ans.

+0

C'est supergreat, permet la mise en cache. –

+1

C'est intéressant, mais ce n'est pas une solution PHP. En outre, la façon dont il est formulé, on ne sait pas ce que 'date (" c ", $ post_date)" a à voir avec quoi que ce soit (je pensais même que vous étiez en train de dire ce qui est en dessous). – Artefacto

+0

@Artefacto: c'est parce que vous n'avez pas lu la page Timeago. Il fonctionne avec une 'classe' de' timeago' et un horodatage ISO 8601 dans 'title'. l'appel de fonction PHP 'date()' ci-dessus donne un format ISO 8601. – bakkal

1
$ts = new DateTime(); 
$ts->setTimestamp($my_timestamp); 
$cur = new DateTime(); 
$difference = $cur->diff($ts); 
if ($difference->format("%a") == 0) 
    $out = $difference->format("%h hours %i minutes"); 
elseif ($difference->format("%a") < 7) 
    $out = $difference->format("%a days"); 
elseif ($difference->format("%m") == 0) { 
    $days = $difference->format("%a"); 
    $out = sprintf("%d weeks %d days", floor($days/7), 
     $days % 7); 
} 
elseif ($difference->format("%y") == 0) 
    $out = $difference->format("%m months"); 
else 
    $out = "over a year"; 

Vous devrez faire quelques ajustements si vous ne voulez pas des choses comme « 1 jour ».

+0

1) Faites-en une fonction. –

+0

@Imr Cela est trivial et est laissé comme un exercice au lecteur. – Artefacto

+0

Merci, Artefacto pour la solution basée sur PHP. Est-ce que vous venez de l'écrire du haut de votre tête, ou l'avez-vous déjà vu? C'est assez intelligent. – Jack