Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [klasa] tekstowa różnica między dwoma datami
Forum PHP.pl > Forum > Gotowe rozwiązania > Szukam
zdzichu
Poszukuję klasy/funkcji która przedstawiałaby w sposób tekstowy różnicę między dwoma datami. Chodziłby tylko o różnice rzędu dni/tygodni/miesięcy, więc godziny/minuty/sekundy mnie nie interesują.
Posiada ktoś coś w tym stylu?
Z góry dzięki za wszelkie odpowiedzi
Wicepsik
Witam,
Właśnie zacząłem uczyć się klas, stworzyłem coś takiego.

  1. <?php
  2. class data {
  3.    
  4.    public function text($od, $do){
  5.            $preg = '/^([0-9]{1,2})-([0-9]{1,2})-([0-9]{4,4})$/';
  6.        if( !preg_match($preg, $od) or !preg_match($preg, $do) ){
  7.            throw new Exception('Błędy format daty!');
  8.        }else{
  9.              $st = explode('-', $od);
  10.              $nd = explode('-', $do);
  11.              $fst = mktime(0, 0, 0, $st[1], $st[0], $st[2]); // data pierwsza
  12.              $snd = mktime(0, 0, 0, $nd[1], $nd[0], $nd[2]); // data druga
  13.             $czas = $snd - $fst;
  14.        }
  15.        if($czas < 0) throw new Exception('Data pierwsza większa od drugiej!');
  16.        
  17.      return $this->czas = $czas;
  18.        
  19.    }
  20.    
  21.    public function aTime()
  22.    {
  23.            $ti = $this->czas;
  24.            $m = date('t');
  25.            $tygodni = sprintf("%2d", floor($ti / (604800) % 4));
  26.            $dni = sprintf("%2d", floor($ti / (60 * 60 * 24) % 7));
  27.            $miesiecy = sprintf("%2d", floor($ti / (60 * 60 * 24 * $m) % 999));
  28.  
  29.        if($tygodni == 1){ $tyg = 'tydzień'; }
  30.        elseif($tygodni == 2){ $tyg = 'tygodnie'; }
  31.        else{ $tyg = 'tygodni'; }
  32.        
  33.        if($miesiecy == 1){ $msc = 'miesiąc'; }
  34.        elseif($miesiecy == 2){ $msc = 'miesiące'; }
  35.        else{ $msc = 'miesięcy'; }
  36.        
  37.        $dn = ($dni == 1) ? 'dzień' : 'dni';
  38.        
  39.        return $miesiecy.' '.$msc.' '.$tygodni.' '.$tyg.' '.$dni.' '.$dn;
  40.    
  41.    }
  42. }
  43.  
  44. $obiekt = new data;
  45. try {
  46.    $obiekt->text('9-01-2011', '16-01-2011');
  47.    echo $obiekt->aTime();
  48. }catch(Exception $e) {
  49.    echo $e->getMessage();
  50. }
  51. ?>


Może to nie jest najlepszy sposób, jeżeli ktoś uważa że jest źle niech napisze swoje wskazówki bym nie popełnił błędu w przyszłości.
Fifi209
  1. <?php
  2. $this->czas
  3. ?>


Najpierw ją "zdefiniuj?"

  1. <?php
  2. public $czas;
  3. ?>


Dalej:
W tak małej klasie nie potrzebne jest chyba rzucanie wyjątków.

Co do metody aTime() ja bym ją zrobił jako private

i dołożył do kodu magiczną metodę:

  1. <?php
  2. public function __toString() {
  3. return $this->aTime();
  4. }
  5. ?>


przy wyświetlaniu:

  1. <?php
  2. echo $obiekt;
  3. ?>
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-2024 Invision Power Services, Inc.