title: Date Diff Human Format Output in PHP
body: <p>Ok I have found so many threads on this topic, but can't find one that seems to be working for me.</p>
  
  <p>I've got a script that is working, but only if the input date is today, but I have a date for example that's <code>Sunday 7th of July at 10:51am</code>, and it's coming up as <code>Thursday at 12:33 pm</code>, and anything older than a week is coming up as <code>January 1 at 12:33 pm</code>.</p>
  
  <p>This is my script so far (The input date <code>$timestamp</code> is in the format <code>Y-m-d H:i:s</code>)</p>
  
  <pre><code>function dateDiff($timestamp) {
  if(empty($timestamp)) {
      return "No date provided";
  }
  // Get time difference and setup arrays
  $unix_date = strtotime($timestamp);
  if(empty($unix_date)) {    
      return "Bad date";
  }
  $difference = time() - $unix_date;
  $periods = array("second", "minute", "hour", "day", "week", "month", "years");
  $lengths = array("60","60","24","7","4.35","12"); 
  // Past or present
  if ($difference &gt;= 0) {
      $ending = "ago";
  } else {
      $difference = -$difference;
      $ending = "to go";
  } 
  // Figure out difference by looping while less than array length
  // and difference is larger than lengths.
  $arr_len = count($lengths);
  for($j = 0; $j &lt; $arr_len &amp;&amp; $difference &gt;= $lengths[$j]; $j++) {
      $difference /= $lengths[$j];
  } 
  // Round up     
  $difference = round($difference); 
  // Make plural if needed
  if($difference != 1) {
      $periods[$j].= "s";
  } 
  // Default format
  $text = $difference." ".$periods[$j]." ".$ending; 
  // over 24 hours
  if($j &gt; 2) {
      // future date over a day formate with year
      if($ending == "to go") {
          if($j == 3 &amp;&amp; $difference == 1) {
              $text = "Tomorrow at ". date("g:i a", $timestamp);
          } else {
              $text = date("F j, Y \a\\t g:i a", $timestamp);
          }
          return $text;
      } 
      if($j == 3 &amp;&amp; $difference == 1) { // Yesterday
          $text = "Yesterday at ". date("g:i a", $timestamp);
      } else if($j == 3) { // Less than a week display -- Monday at 5:28pm
          $text = date("l \a\\t g:i a", $timestamp);
      } else if($j &lt; 6 &amp;&amp; !($j == 5 &amp;&amp; $difference == 12)) { // Less than a year display -- June 25 at 5:23am
          $text = date("F j \a\\t g:i a", $timestamp);
      } else { // if over a year or the same month one year ago -- June 30, 2010 at 5:34pm
          $text = date("F j, Y \a\\t g:i a", $timestamp);
      }
  } 
  return $text;
  }
  </code></pre>
  
  <p>Can anyone see what may be making it show the wrong information??</p>