Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Obliczenie czy od podanej daty minął więcej niż rok czy mniej niż rok
Forum PHP.pl > Forum > Przedszkole
Elber
Witam,

mam problem smile.gif Główkuję tutaj (może za bardzo), aby obliczyć czy od dziś do podanej daty minie równy rok, mniej niż rok czy więcej...wszystko byłoby spoko gdyby nie rok przestępny...bo tego nie umiem rozgryźć, bo biorąc sztywno że rok ma 365 dni, odejmując do daty 30 maja 2012 - datę 8 marca 2012 obliczamy ilość dni i możemy zrobić prostego IF'a dzieląc wynik przez 365 i jak wynik < 1 to znaczy że nie cały rok minie...jak wynik == 1 to znaczy ze rok, jak wynik > 1 to więcej niż rok...a co z przestępnością ?
peter13135
http://www.php.net/strtotime

Dodajesz rok i porównujesz biggrin.gif
Elber
cały czas zamieniam datę na strtotime i wtedy odejmuje ... ale nie rozumiem dodajesz rok i porównujesz ?
irmidjusz
Może ułatw sobie życie i nie sprawdzaj, czy minie rok, ale czy minie założona, stała liczba dni, np. 365? biggrin.gif
Czyli chodzi mi o to, czy aby na pewno potrzebne Ci nieprecyzyjne pojęcie roku?

To trochę tak jak z kupowaniem biletów miesięcznych komunikacji miejskiej. Mimo, że ma "miesięczny" w nazwie, to tak naprawdę zawsze kupuje się go na 30 dni - i wszystkie kalkulacje są proste smile.gif
Crozin
Od czegoś ten DateTime w końcu jest, co nie?
  1. $yearAgo = new DateTime('-1 year');
  2. $someDate = new DateTime('24.04.2009');
  3.  
  4. if ($someDate == $yearAgo) {
  5. // dokładnie rok temu
  6. } else if ($someDate > $yearAgo) {
  7. // mniej niż rok temu
  8. } else {
  9. // więcej niż rok temu
  10. }
PS. W PHP operatory porównania dla obiektu DateTime są przeciążone, stąd możliwość takiego zapisu.
Elber
Super działa wink.gif Tylko coś nie da się sprawdzić dokładnego roku, czyli jak dam

$yearAgo = new DateTime('+1 year');
$someDate = new DateTime('08.03.2013');

to warunek

$someDate == $yearAgo

powinien być spełniony ale nie jest, jak sprawdzić czy minie równy rok ?
poli25
Na tej stroniesprawdz rok przestepny
jest fajna fukcja ktora sprawdza czy rok jest przestepny wtedy wiesz ile dni masz masz odejowac

"function is_leap($year=NULL) {
return checkdate(2, 29, ($year==NULL)? date('Y'):$year); // true if is a leap year
}"

poczytaj otez tutaj http://md.php.net/manual/en/function.date.php
o leap year
Elber
Już sobie ładnie poradziłem wink.gif

$yearAgo = new DateTime(date('d.m.Y') . '- 1 year');

A jak sprawdzić ile miesięcy jest różnicy między tymi datami ?

Kod
    $start = strtotime(date('d.m.Y'));

    $stop = strtotime('1.03.2013');    
    
    echo round(($stop-$start)/60/60/24/30);


Dobrze to obliczam ?
Crozin
1. DateTime::diff().
2. DateInterval.
Elber
kurcze nie umiem znaleźć precyzyjnej metody która mi dokładnie policzy ile miesięcy jest różnicy np. między 08.03.2012 (dziś) a 06.06.2014 questionmark.gif powinno to zaokrąglać w górę (dni) czyli powinno wskazać 27 miesięcy...jak do tego dojść ?
Crozin
1. Pomiędzy tymi dwoma datami minęło 26, nie 27 miesięcy.
2. Da się to obliczyć przy pomocy podanych przeze mnie metod. Pokaż co próbowałeś zrobić.
Elber
Kod
$data_teraz = date('d.m.Y');
    $data_podana = '07.08.2012';
$datetime1 = date_create($data_teraz);
    $datetime2 = date_create($data_podana);

    $diff = $datetime1->diff($datetime2);
    
    $miesiace = $diff->format('%m');
echo $miesiace;
Crozin
Podpowiedź: DateInterval zawiera liczbę lat, miesięcy, dni, godzin, minut oraz sekund. Czyli łączna ilość miesięcy to 12 * liczbaLat + liczbaMiesięcy.
Elber
Ale nie wiem jak go użyć w praktyce ;(
Crozin
  1. print_r($diff);
No to to już Ci musi wszystko rozjaśnić...
Elber
Wszystko byłoby super gdyby nie zerował liczby miesięcy, bo jak już wskoczy 1 rok to miesiące na 0 przeskakują ;/
Crozin
Serio? Nie potrafisz liczby lat i miesięcy zamienić na łączną liczbę miesięcy, mając do tego podany wzór? Zdajesz sobie sprawę, że takie zadanie mogłoby być ubliżające dla co poniektórych przedszkolaków?
Elber
Sory, ale męczę to już tyle godzin że nie myślę racjonalnie, mogę pomnożyć $diff->y * 12 jeśli jest większy niż 0
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.