Topic awaiting preservation: Relative Date Function |
|
---|---|
Author | Thread |
Bipolar (III) Inmate From: Underneath a mountain of blankets. |
posted 09-04-2007 21:12
No... I didn't disappear. I've just been lurking. Wrote it this evening... was fairly proud of it. Comments? Oo; code: <? function reltime($old_time, $cur_time = -1) { // Code by RukuArtic, 2007 // Bunch of defines for my code... define('YEAR', 1); define('MONTH', 2); define('WEEK', 3); define('DAY', 4); define('HOUR', 5); define('MIN', 6); define('SECOND', 7); define('WORD_YEAR', " year"); define('WORD_MONTH', " month"); define('WORD_WEEK', " week"); define('WORD_DAY', " day"); define('WORD_HOUR', " hour"); define('WORD_MIN', " minute"); define('WORD_SEC', " second"); // This just makes pluralizing easier. define('P', "s"); define('SEC_YEAR', 31556926); define('SEC_MONTH', 2629744); define('SEC_WEEK', 604800); define('SEC_DAY', 86400); define('SEC_HOUR', 3600); define('SEC_MIN', 60); $format = "%t ago"; // If they didn't set a time to compare it to, use the current time. if($cur_time == -1) $cur_time = time(); // Calculate the number of seconds between times, compensate for // times in the future. $diff = $cur_time - $old_time; if($diff < 0) { $format = "in %t"; $diff = abs($diff); } // Heehee. This one's hard to get, but prevents "0 seconds ago" if($diff == 0) return "now"; // Calculate the number of years... etc, keep as integer. // I'm sure this could be more efficient if we break as soon as we // find a number that's not zero... $num[YEAR] = (int)($diff / SEC_YEAR); $diff = $diff % SEC_YEAR; $num[MONTH] = (int)($diff / SEC_MONTH); $diff = $diff % SEC_MONTH; $num[WEEK] = (int)($diff / SEC_WEEK); $diff = $diff % SEC_WEEK; $num[DAY] = (int)($diff / SEC_DAY); $diff = $diff % SEC_DAY; $num[HOUR] = (int)($diff / SEC_HOUR); $diff = $diff % SEC_HOUR; $num[MINUTE] = (int)($diff / SEC_MIN); $diff = $diff % SEC_MIN; $num[SECOND] = $diff; // Find the biggest value -- ie: 1 year > 11 months $type = SECOND; for($i = SECOND; $i >= YEAR; $i--) if($num[$i] > 0) $type = $i; // Assume plural, unless the number is 1. $plural = true; if($num[$type] == 1) $plural = false; // And return it switch($type) { case YEAR: return str_replace('%t', ($plural ? $num[YEAR] . WORD_YEAR . P : $num[YEAR] . WORD_YEAR), $format); case MONTH: return str_replace('%t', ($plural ? $num[MONTH] . WORD_MONTH . P : $num[MONTH] . WORD_MONTH), $format); case WEEK: return str_replace('%t', ($plural ? $num[WEEK] . WORD_WEEK . P : $num[WEEK] . WORD_WEEK), $format); case DAY: return str_replace('%t', ($plural ? $num[DAY] . WORD_DAY . P : $num[DAY] . WORD_DAY), $format); case HOUR: return str_replace('%t', ($plural ? $num[HOUR] . WORD_HOUR . P : $num[HOUR] . WORD_HOUR), $format); case MINUTE: return str_replace('%t', ($plural ? $num[MINUTE] . WORD_MINUTE . P : $num[MINUTE] . WORD_MINUTE), $format); case SECOND: return str_replace('%t', ($plural ? $num[SECOND] . WORD_SECOND . P : $num[SECOND] . WORD_SECOND), $format); } } ?>
|
Paranoid (IV) Inmate From: Norway |
posted 09-04-2007 23:42
Similar function in JS: code: function diff( hay, ref ) { var dif = Math.round( (hay.valueOf()-(ref||new Date()))/1000 ) ,h = { 'year' :60*60*24*365.25 ,'week' :60*60*24*7 ,'day' :60*60*24 ,'hour' :60*60 ,'minute' :60 ,'second' :1 } ,mod if( dif ) for( var k in h ) if( 'nmber'==typeof(h[k]) && (mod=Math.floor(Math.abs(dif)/h[k])) ) return (dif>0?'in ':'')+ mod +' '+ k +(mod-1?'s':'')+(dif<0?' ago':''); return 'now'; }
|
Paranoid (IV) Inmate From: f(x) |
posted 09-05-2007 00:41
Here's yet another similar function in Perl: code: # The difference in seconds is passed to the function. # Counts up to days, not weeks, months, or years. sub convert_sec { $seconds = shift; $ret = ""; $days = $hours = $minutes = 0; if ($seconds >= 60){ $minutes = floor($seconds/60); $seconds -= $minutes*60; } if ($minutes >= 60){ $hours = floor($minutes/60); $minutes -= $hours*60; } if ($hours >= 24){ $days = floor($hours/24); $hours -= $days*24; } if ($days){ $ret .= $days."d "; } if ($hours){ $ret .= $hours."h "; } if ($minutes){ $ret .= $minutes."m "; } if ($seconds){ $ret .= $seconds."s"; } $ret =~ s/(^\s+|\s+$)//g; return $ret; } |
Bipolar (III) Inmate From: Curled up with a ... ...warm laptop? |
posted 09-05-2007 00:42
D: And that'll get the user's computer to run it won't it... thus saving server CPU and... |