2011-11-02 11 views
0

Y at-il une bibliothèque PHP qui permet de convertir un horodatage unix en quelque chose comme ce format:conversion temps PHP

8 hours and 17 minutes ago 

J'ai fait mon propre un script en arrière qui a fait cela, je ne peux pas le suivre vers le bas et préfère ne pas passer le temps à le recréer (de plus je pense que cela aurait pu être fait beaucoup plus efficacement).

Mon code d'origine était quelque chose le long des lignes de:

$seconds = time() - $timestamp; 

$minutes = 0; 
$hours = 0; 
$days = 0; 
$weeks = 0; 
$months = 0; 
$years = 0; 

while($seconds >= 60) 
{ 
    $seconds -= 60; 
    $minutes ++; 

    if($minutes >= 60) 
    { 
     $minutes -= 60; 
     $hours ++; 

     if($hours >= 24) 
     { 
      // etc 
     } 
    } 
} 

if($hours < 1) return "$minutes minute" . ($minutes == 1 ? "" : "s")) . " and $seconds seconds" . ($seconds == 1 ? "" : "s")); 
if($minutes < 1) return "$seconds second" . ($seconds == 1 ? "" : "s")); 

// etc 

Mieux encore, s'il y a une plus belle façon d'aborder ce qui précède, je vais le donner moi-même se fissurer aussi bien.

Répondre

5

Oui, vérifier The DateTime class.

$datetime1= new DateTime(); 
$datetime2= new DateTime(); 
$datetime2->setTimestamp($timestamp); 

$interval = $datetime2->diff($datetime1); 
echo $interval->format('%a days %h hours and %i minutes ago'); 
0
/* 
    Input parameter is the UNIX timestamp 
    of the starting date. 
    The second parameter is optional - 
    It's value is the ending date, 
    also UNIX timestamp. If this 
    parameter is not given, the 
    default date is current date. 
*/ 
function duration($start,$end=null) { 
$end = is_null($end) ? time() : $end; 

$seconds = $end - $start; 

$days = floor($seconds/60/60/24); 
$hours = $seconds/60/60%24; 
$mins = $seconds/60%60; 
$secs = $seconds%60; 

$duration=''; 
if($days>0) $duration .= "$days days "; 
if($hours>0) $duration .= "$hours hours "; 
if($mins>0) $duration .= "$mins minutes "; 
if($secs>0) $duration .= "$secs seconds "; 

//$duration = trim($duration); 
if($duration=='') $duration = '0 seconds'; 

return $duration; 
} 

Ce qu'il ne vous convient mieux utiliser certaines classes, indiquées ci-dessous

http://www.phpclasses.org/browse/file/6330.html

+0

Grande réponse. Mon seul commentaire serait de remplacer if ($ duration == null) par if (vide ($ duration)) ou mieux encore, ne pas avoir le if ($ secs> 0) et vous n'avez pas besoin des deux dernières lignes ... –

0
function TimeAgo($datefrom,$dateto=-1) 
{ 
// Defaults and assume if 0 is passed in that 
// its an error rather than the epoch 

if($datefrom<=0) { return "A long time ago"; } 
if($dateto==-1) { $dateto = time(); } 

// Calculate the difference in seconds betweeen 
// the two timestamps 

$difference = $dateto - $datefrom; 

// If difference is less than 60 seconds, 
// seconds is a good interval of choice 

if($difference < 60) 
{ 
$interval = "s"; 
} 

// If difference is between 60 seconds and 
// 60 minutes, minutes is a good interval 
elseif($difference >= 60 && $difference<60*60) 
{ 
$interval = "n"; 
} 

// If difference is between 1 hour and 24 hours 
// hours is a good interval 
elseif($difference >= 60*60 && $difference<60*60*24) 
{ 
$interval = "h"; 
} 

// If difference is between 1 day and 7 days 
// days is a good interval 
elseif($difference >= 60*60*24 && $difference<60*60*24*7) 
{ 
$interval = "d"; 
} 

// If difference is between 1 week and 30 days 
// weeks is a good interval 
elseif($difference >= 60*60*24*7 && $difference < 
60*60*24*30) 
{ 
$interval = "ww"; 
} 

// If difference is between 30 days and 365 days 
// months is a good interval, again, the same thing 
// applies, if the 29th February happens to exist 
// between your 2 dates, the function will return 
// the 'incorrect' value for a day 
elseif($difference >= 60*60*24*30 && $difference < 
60*60*24*365) 
{ 
$interval = "m"; 
} 

// If difference is greater than or equal to 365 
// days, return year. This will be incorrect if 
// for example, you call the function on the 28th April 
// 2008 passing in 29th April 2007. It will return 
// 1 year ago when in actual fact (yawn!) not quite 
// a year has gone by 
elseif($difference >= 60*60*24*365) 
{ 
$interval = "y"; 
} 

// Based on the interval, determine the 
// number of units between the two dates 
// From this point on, you would be hard 
// pushed telling the difference between 
// this function and DateDiff. If the $datediff 
// returned is 1, be sure to return the singular 
// of the unit, e.g. 'day' rather 'days' 

switch($interval) 
{ 
case "m": 
$months_difference = floor($difference/60/60/24/
29); 
while (mktime(date("H", $datefrom), date("i", $datefrom), 
date("s", $datefrom), date("n", $datefrom)+($months_difference), 
date("j", $dateto), date("Y", $datefrom)) < $dateto) 
{ 
$months_difference++; 
} 
$datediff = $months_difference; 

// We need this in here because it is possible 
// to have an 'm' interval and a months 
// difference of 12 because we are using 29 days 
// in a month 

if($datediff==12) 
{ 
$datediff--; 
} 

$res = ($datediff==1) ? "$datediff month ago" : "$datediff 
months ago"; 
break; 

case "y": 
$datediff = floor($difference/60/60/24/365); 
$res = ($datediff==1) ? "$datediff year ago" : "$datediff 
years ago"; 
break; 

case "d": 
$datediff = floor($difference/60/60/24); 
$res = ($datediff==1) ? "$datediff day ago" : "$datediff 
days ago"; 
break; 

case "ww": 
$datediff = floor($difference/60/60/24/7); 
$res = ($datediff==1) ? "$datediff week ago" : "$datediff 
weeks ago"; 
break; 

case "h": 
$datediff = floor($difference/60/60); 
$res = ($datediff==1) ? "$datediff hour ago" : "$datediff 
hours ago"; 
break; 

case "n": 
$datediff = floor($difference/60); 
$res = ($datediff==1) ? "$datediff minute ago" : 
"$datediff minutes ago"; 
break; 

case "s": 
$datediff = $difference; 
$res = ($datediff==1) ? "$datediff second ago" : 
"$datediff seconds ago"; 
break; 
} 
return $res; 
}