Функция за четимо представяне на разлика между 2 дати

Публикувано на: януари 14th, 2009 от Mad Master в Статии

На много места в сайтовете ви се налага да показвате дата, било то на публикация или последно обновяване на страница. От известно време се наблюдава тенденция да се променя начина на представяне на датите към по-четим за потребителите формат, с думи, пред старото изливане начислата от датата.
По-долу можете да видите една примерна функция. На практика няма нищо особено в тази функция - форматирането се извършва на базата на определяне на интервала, в който попада изминалото време между двете дати, защото все пак не е уместно времето между два понеделника да се изписва в минути та да се получи “преди 10080 минути”.

function TimeAgo($datefrom,$dateto=-1)
{
 
  // Началната дата е 01.01.1970
  if($datefrom<=0) { return "Преди много време"; }
  if($dateto==-1) { $dateto = time(); }
 
  // Разлика в секунди между датите
  $difference = $dateto - $datefrom;
 
  // Ако разликата е под минута, показваме секундите
  if($difference < 60)
  {
    $interval = "s";
  }
 
  // Ако интервала е между 1 и 60 минути показваме минутите
  elseif($difference >= 60 && $difference<60*60)
  {
    $interval = "n";
  }
 
  // Ако интервала е между 1 и 24 часа, показваме часовете
  elseif($difference >= 60*60 && $difference<60*60*24)
  {
    $interval = "h";
  }
 
  // Ако е в рамките на седмицата, показваме дните
  elseif($difference >= 60*60*24 && $difference<60*60*24*7)
  {
    $interval = "d";
  }
 
  // Ако е между 1 и 30 дена, показваме седмиците
  elseif($difference >= 60*60*24*7 && $difference <
  60*60*24*30)
  {
    $interval = "ww";
  }
 
  // Ако интервала е между 30 дена и 1 година показваме месеците
  elseif($difference >= 60*60*24*30 && $difference <
  60*60*24*365)
  {
    $interval = "m";
  }
 
  // Ако интервала е над 365 дена показваме годините
  elseif($difference >= 60*60*24*365)
  {
    $interval = "y";
  }
 
  /*
   * На база на интервала определяме броя единици
   * между датите.Също така определяме думичките
   * за ед./мн. число (ако е 1 или са повече)
   */
 
  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 месеца";
      break;
 
    case "y":
      $datediff = floor($difference / 60 / 60 / 24 / 365);
      $res = ($datediff==1) ? "преди година" : "преди $datediff години";
      break;
 
    case "d":
      $datediff = floor($difference / 60 / 60 / 24);
      $res = ($datediff==1) ? "преди един ден" : "преди $datediff дена";
      break;
 
    case "ww":
      $datediff = floor($difference / 60 / 60 / 24 / 7);
      $res = ($datediff==1) ? "преди седмица" : "преди $datediff седмици";
      break;
 
    case "h":
      $datediff = floor($difference / 60 / 60);
      $res = ($datediff==1) ? "преди час" : "преди $datediff часа";
      break;
 
    case "n":
      $datediff = floor($difference / 60);
      $res = ($datediff==1) ? "преди минута" : "преди $datediff минути";
      break;
 
    case "s":
      $datediff = $difference;
      $res = ($datediff==1) ? "перди секунда" : "перди $datediff секунди";
      break;
  }
  return $res;
}
Споделете с приятели:
  • Svejo.net
  • Facebook
  • Digg
  • Technorati
  • del.icio.us
  • Google
  • Dao.bg
  • Dobavi.com
  • MySpace
  • Ping.bg
  • Pipe.bg
  • Web-BG

Остави отговор




XHTML::
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="">