Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php/mysql] uwzględnienie lat przestępnych
Forum PHP.pl > Forum > PHP
M@X
Witam.
Posiadam taki fajny mechanizm wyliczający ilość lat. W bazie jest data, a mechanizm wyswietla ile lat minęło od tej daty. Jest tylko jeden problem bo przy większej ilości lat pojawia się coraz większy błąd, wydaje mi się że chodzi o lata przestępne.
Ktoś wie w jaki sposób to rozwiązać ?

  1. <?
  2. function sufix ($Number) {
  3.  return (($Number == 1)?'a':((in_array ($Number, array (2, 3, 4)) 
  4. || ($Number > 20 && in_array (substr ($Number, -1, 1), array (2, 3, 4))))?'y':''));
  5.  }
  6. function wiek ($Date, $Date2, $Text = '', $Text2 = '') {
  7.  $Date = strtotime ($Date);
  8.  if ($Date2 == 'NOW') {
  9. if ($Date < time ()) {
  10.  $Date2 = time ();
  11.  $Prefix = $Text;
  12.  }
  13. else {
  14.  $Date2 = $Date;
  15.  $Date = time ();
  16.  $Prefix = $Text2;
  17.  }
  18. }
  19.  else {
  20.  $Date2 = strtotime ($Date2);
  21.  $Prefix = 'Roznica czasu pomiedzy tymi dwiema datami wynosi: ';
  22.  }
  23.  $Years=floor(($Date2-$Date)/(86400*365));
  24.  //$Monts=floor(($Date2-$Date-$Years*(86400*365))/(2678400)); 
  25.  //$Days=floor(($Date2-$Date-$Years*(86400*365)-$Monts*2678400)/(86400));
  26.  //$Hours = intval ((($Date2 - $Date) / 3600) - ($Days * 24));
  27.  //$Minutes = intval ((($Date2 - $Date) / 60) - (($Hours * 60) + ($Days * 1440)));
  28.  //$Seconds = intval ($Date2 - $Date - (($Minutes * 60) + ($Hours * 3600) + ($Days * 86400)));
  29.  return ($Prefix.((!empty ($Years))?$Years.(($Years == 1)?' rok, ':' lat'):'').
  30. ((!empty ($Monts))?$Monts.(($Monts == 1)?' miesiÄ…c, ':' miesiÄ™cy, '):'').
  31. ((!empty ($Days))?$Days.(($Days == 1)?' dzieĹ„':' dni'):'').
  32. ((!empty ($Days) && !empty ($Hours))?', ':'').((!empty ($Hours))?$Hours.' godzin'.sufix ($Hours):'').
  33. (((!empty ($Hours) || !empty ($Days)) && !empty ($Minutes))?', ':'').
  34. ((!empty ($Minutes))?$Minutes.' minut'.sufix ($Minutes):'').
  35. (((!empty ($Hours) || !empty ($Days) || !empty ($Minutes)) && !empty ($Seconds))?' i ':'').
  36. ((!empty ($Seconds))?$Seconds.' sekund'.sufix ($Seconds):'').'.');
  37.  }
  38. ?>


do wyświetlania używam:

  1. <?php
  2. $a=wiek(''.$result['data_ur'].'','NOW');
  3. echo $a.?>
pest
Powiem tak - nie za bardzo mam siłę analizować ten skrypt, ale powiedz mi jedno - dlaczego bawisz się w minuty, godziny, dni itd. Po to są funkcje czasu żeby z nich korzystać.

Nie zastanawiaj się nad latami przestępnymi tylko działaj na datach.
  1. <?php
  2. // Możesz to zrobić tak żeby liczyć po latach (tylko rocznikowa różnica)
  3. $lat = date("Y",$data2)-date("Y",$data1);
  4. // Albo moża też zrobić, żeby ilość lat dokładnie była porównywana 
  5. // (z dniem i godziną kiedy np. ktoś ma urodziny)
  6. // wtedy działasz do końca na datach i dopiero zamieniasz
  7. $lat2 = date("Y",$data2-$data1)-1970; // -1970 bo od tego czasu (dokładniej pierwszego stycznia 1970 liczony jest czas w systemach)
  8. ?>
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.