Age of an article in PHP
I read a few days ago this article with the code to print the age of an article by Bleebot. As this function is long and not well optimized, I build my own one.
~
First some comments about the given function. Bleebot writes a lot of lines to rewrite existing functions.
$date2 = mktime(date("H"), date("i"), date("s"), date("m"),date("d"),date("Y"));
so $date2 is the actual time, it means simply the time() function!
list($year, $month, $day_time) = explode('-', $mysqlDate);
list($day, $time) = explode(" ", $day_time);
list($hour, $minute, $second) = explode(":", $time);
$date1 = mktime($hour, $minute, $second, $month, $day, $year);
All that to convert the date in timestamp. Which is the goal of the function strtotime. So an equivalent is $date1 = strtotime ($mysqlDate).
$timedifference=$date2-$date1;
$corr=date("I",$date2)-date("I",$date1);
$timedifference+=$corr;
It's useless to caculate the summer or winter time, because we are in timestamp yet so a time in seconds since January 1, 1970. mktime has already do the job for summer or winter time to calculate this number of seconds!
$period = $timedifference;
$messtime = "";
2 useless lines! Why pass from $timedifference to $period?
Why put a empty string in $messtime, it's always initialized in the following? And simple quotes in strings when we don't use variables!
Then Bleebot takes care of the plural, 1 or several days/hours/minutes to write a 's' or not. This is a good idea, but when we must modify the text (for example for a translation), there are 6 places to modify. So why use memory to place it in a variable instead of writing it directly?
~
Of course, I don't say all that badly, it's just to make you learn some mistakes to not reproduce.
Here is my solution:
<?php
function dateDiff ($date)
{
$seconds = time() - strtotime ($date); /* The time difference in seconds. */
/* We first find the unit: */
if (($age = floor ($seconds /3600/24)) > 0)
$unit = 'day';
elseif (($age = floor ($seconds /3600)) > 0)
$unit = 'hour';
else
{
$age = floor ($seconds /60);
$unit = 'minute';
}
/* Then $plural = 's' if $age >1, else empty: */
$plural = ($age > 1)? 's': '';
echo "Posted $age $unit$plural ago.";
}
/* Call of the function: */
dateDiff ('2008-07-12 19:35:06');
?>
~
Things to remember: mktime is useless here, it's generally used when we have pieces of date. In other cases, strtotime is a very powerful function which recognize the dates written on different formats, even in natural english: '2008-07-12', 'now', '12 July 2008', '+3 week 2 days 4 hours', 'next Thursday', 'last Monday'.
To optimize your code, only stock in variables what you really need to stock. Note that if you only want to change the name, the =& syntax allows to create an alias of a variable. For example to short $_SESSION in $s:
$s =& $_SESSION;
By modifying $s, it modifies $_SESSION, this it not a copy, but a kind of pointer.
If you have questions or remarks, just ask, I always answer to comments.