Преди колко дни е пуснат поста

bama

Registered
Записвам датата така - 201004150933 - Година, месец, ден, час, минута и искам да пресметна преди колко време е било пуснато дадено мнение или нещо друго..
Нещо от рода на: Пуснато преди 1 минута или преди 2 часа и 5 мин..
 
Първо, по-добре ще е да запазваш датите си в Unix Timestamp формат ( или с две думи, да използваш функцията time() ).
Ако имаш твърде много записи в базата данни за да го променяш, разгледай функцията mktime() .
След това правиш следното:
Код:
$time = ...; // Тук поставяш функцията mktime() или директно Unix Timestamp-a от базата данни, зависи как си решил да го направиш.

$timenow = time(); //Взимаме времето в момента под Unix Timestamp формат

$diff = $timenow - $time; // Намираме разликата 

$before = date( 'y-m-d H:i:s', $diff ); // Допълнителният праметър $diff казва на функцията date() да извади дата, в определения от първия параметър формат, не за сегашния момент, а за момента, който посочва $diff

Надявам си да си ме разбрал :)
 
Ето ти и още една алтернатива
function calc_post_days($time) {
if ($time >= 3600*24) { return date("d/m/Y H:i:s",time() - $time); }
else {
$mtime = array("hours" => 0,"minutes" => 0,"seconds" => 0);
if ($time >= 3600) {
$mtime['hours'] = floor($time/3600);
$time = $time - 3600 * $mtime['hours'];
}
if ($time >= 60) {
$mtime['minutes'] = floor($time/60);
$time = $time - 60 * $mtime['minutes'];
}
$mtime['seconds'] = $time;
return $mtime;
}
}
и ето как да я използваш
$time = calc_post_days(time()-$row['time']); // тук изчисляваш разликата от time() - $row['time'], където $row['time'] е Unix Timestamp-а от базата данни
if (is_array($time)) {
// постът е пуснат преди по-малко от един ден, добавил съм и проверка дали има един час от пускането, ако няма - не се показва 0hr
echo (($time['hours'] > 0) ? $time['hours']."hr " : "").$time['minutes']."min and ".$time['seconds']."sec";
}
else {
echo $time;
}
Ако постът е пуснат преди по-малко от ден, ще ти го изчисли. Ако е на повече от един ден, ще ти върне направо датата на пускането (надявам се) :?:
 
Може и да не е най-елегантният начин, вероятно има и по-красиви и по-бързи и т.н, но пък го тествах и бачка:

Като за начало ни трябва функция, която от твоя начин за записване на дати да прехвърля в секунди:

Код:
function date2time($strange) {
  $prevdate = array();
  $prevdate[] = substr($strange, 0, 4);
  $prevdate[] = substr($strange, 4, 2);
  $prevdate[] = substr($strange, 6, 2);
  $prevdate[] = substr($strange, 8, 2);
  $prevdate[] = substr($strange, -2);
  $newdate = $prevdate[2].".".$prevdate[1].".".$prevdate[0]." ".$prevdate[3].":".$prevdate[4];
  return strtotime($newdate);
}
$date = 201004081303;
$ctime = date2time($date);

И така $ctime вече можем да я ползваме както намерим за добре. Продължаваме нататък с функцията, която изчислява с точност до седмици:

Код:
function calctime($calcdate) {
  $past = time() - $calcdate;
  $days = floor($past / 86400);
  $hours = floor(($past - $days * 86400) / 3600);
  $minutespred = $past - (floor($countdown / 3600) * 3600);
  $minutes = $minutespred - (floor($minutespred / 3600) * 3600);
  $minutes = floor($minutes / 60);
  $secondspred = $past - ($days * 86400);
  $seconds = $secondspred - (floor($secondspred / 60) * 60);
  $weeks = floor($days / 7);
  if ($weeks) { $days -= $weeks * 7; }
  if ($seconds == 1) { $return = "1 секунда"; }
  else { $return = $seconds." секунди"; }

  if ($minutes) {
    if ($minutes == 1) { $return = "1 минута и ".$return; }
    else { $return = $minutes." минути и ".$return; }
  }
  if ($hours) {
    if ($hours == 1) { $return = "1 час, ".$return; }
    else { $return = $hours." часа, ".$return; }
  }
  if ($days) {
    if ($days == 1) { $return = "1 ден, ".$return; }
    else { $return = $days." дена, ".$return; }
  }
  if ($weeks) {
    if ($weeks == 1) { $return = "1 седмица, ".$return; }
    else { $return = $weeks." седмици, ".$return; }
  }
  return $return;
}
И накрая с echo calctime($ctime); изкарва нещо от рода на следното: 1 седмица, 13 минути и 42 секунди

И това е в общи линии. Дълго, ама...
 

Back
Горе