2010-12-12 4 views
1

Y at-il une bonne bibliothèque d'impression pour les différences d'horodatage UNIX. Quelque chose sur les goûts des choses vues dans les sites de réseautage social comme "x minutes ago", "x heures ago", "x days ago" etc. Je sais que ce ne sera pas difficile d'écrire tout seul, mais pourquoi réinventer la roue?Jolie bibliothèque d'impression pour les différences de temps en PHP

+0

J'ai récemment répondu à cette question pour quelqu'un d'autre: http://stackoverflow.com/questions/4394161/php-time-calculation/4394181#4394181 –

Répondre

1

Je ne sais pas s'il y a une bibliothèque pour PHP pour cela, mais Jeff (qui a créé ce site web) a posé cette question il y a longtemps. Voir this question pour plus de détails. Je suis sûr que vous pourriez obtenir beaucoup d'inspiration de cela. Jeff répond même à cette question avec the code they use on StackOverflow itself.

Je ne pense pas que ce serait si difficile d'écrire cela vous-même, alors pourquoi ne pas passer 5 minutes à l'écrire au lieu d'une demi-heure à la recherche d'une bibliothèque?

2

essayer

<?php 
function rel_time($from, $to = null) 
{ 
    $to = (($to === null) ? (time()) : ($to)); 
    $to = ((is_int($to)) ? ($to) : (strtotime($to))); 
    $from = ((is_int($from)) ? ($from) : (strtotime($from))); 

    $units = array 
    (
    "year" => 29030400, // seconds in a year (12 months) 
    "month" => 2419200, // seconds in a month (4 weeks) 
    "week" => 604800, // seconds in a week (7 days) 
    "day" => 86400, // seconds in a day (24 hours) 
    "hour" => 3600,  // seconds in an hour (60 minutes) 
    "minute" => 60,  // seconds in a minute (60 seconds) 
    "second" => 1   // 1 second 
); 

    $diff = abs($from - $to); 
    $suffix = (($from > $to) ? ("from now") : ("ago")); 

    foreach($units as $unit => $mult) 
    if($diff >= $mult) 
    { 
    $and = (($mult != 1) ? ("") : ("and ")); 
    $output .= ", ".$and.intval($diff/$mult)." ".$unit.((intval($diff/$mult) == 1) ? ("") : ("s")); 
    $diff -= intval($diff/$mult) * $mult; 
    } 
    $output .= " ".$suffix; 
    $output = substr($output, strlen(", ")); 

    return $output; 
} 
?> 
0

PHP a une classe intégrée pour ce billet depuis PHP 5.3 partir:

DateInterval

Utilisez la méthode format() pour obtenir la sortie que vous souhaitez, si vous avez besoin décider des unités nécessaires je pense.

0
defined('SECOND') ? NULL : define('SECOND', 1); 
defined('MINUTE') ? NULL : define('MINUTE', 60 * SECOND); 
defined('HOUR') ? NULL : define('HOUR', 60 * MINUTE); 
defined('DAY') ? NULL : define('DAY', 24 * HOUR); 
defined('MONTH') ? NULL : define('MONTH', 30 * DAY); 
defined('YEAR') ? NULL : define('YEAR', 12 * MONTH); 

class Time{ 
    public $td; 

    public function set_td($timestamp){ 
     $this->td = time() - $timestamp; 
    } 

    public function string_time($timestamp){ 

     $this->set_td($timestamp); 


     if ($this->td < 0){ 
      return "not yet"; 
     } 
     if ($this->td < 1 * MINUTE){ 
      return $this->td <= 1 ? "just now" : $this->td." seconds ago"; 
     } 
     if ($this->td < 2 * MINUTE){ 
      return "a minute ago"; 
     } 
     if ($this->td < 45 * MINUTE){ 
      return floor($this->td/MINUTE)." minutes ago"; 
     } 
     if ($this->td < 90 * MINUTE){ 
      return "an hour ago"; 
     } 
     if ($this->td < 24 * HOUR){ 
      return floor($this->td/HOUR)." hours ago"; 
     } 
     if ($this->td < 48 * HOUR){ 
      return "yesterday"; 
     } 
     if ($this->td < 30 * DAY){ 
      return floor($this->td/DAY)." days ago"; 
     } 
     if ($this->td < 12 * MONTH){ 
      $months = floor($this->td/MONTH); 
      return $months <= 1 ? "one month ago" : $months." months ago"; 
     }else{ 
      $years = floor($this->td/YEAR); 
      return $years <= 1 ? "one year ago" : $years." years ago"; 
     } 
    } 
} 

$time = new Time(); 

Il suffit de mettre votre horodatage dans le nouvel objet et de récupérer le temps diffenrece dans seconds.e.g.

$string = $time->string_time($timestamp); 
Questions connexes