odejmowanie dat i sprawdzanie różnicy w dniach

0

Witam!

Rzecz wydawała mi się banalna ale okazało się inaczej.

Chciałem sprawdzić różnicę w dniach dwóch dat
Jedną pobieram do zmiennej

$dzisiaj=date("Y-m-d");

a drugą pobieram z bazy w formacie "datatime"
nazwijmy ją $data2

miałem nadzieję , że zwykłym odejmowaniem dat

$iledni=$dzisiaj-$data2;

otrzymam wynik ale nie
próbowałem już kilku innych sposobów ale też na nic, proszę Was drodzy forumowicze o małą podpowiedź :) i pomoc w rozwiązaniu mojego problemiku. Z góry dzięki.

0
$result = round((strtotime($date1) - strtotime($date2)) / 86400)

86400 to liczba sekund w ciagu doby.

Jezeli korzystasz z PHP 5.3, to tu jest przyklad: http://us1.php.net/manual/pl/datetime.diff.php

0

Nie działa to dobrze. Sądzę, że to problem w różnicy formatów dat otóż

Przekształciłem kod na taki

$result=round((strtotime($dzisiaj)-strtotime($wyn['czas']))/86400); 

gdzie $dzisiaj=date("Y-m-d"); czyli w chwili pisania postu '2014-02-06' a $wyn['czas'] pobralem z bazy w formacie '2014-02-03 19:52:02'
i wyszło "2" a powinno "3"

następnie zamieniłem $wyn['czas'] na '2014-02-03' i wyszło poprawnie "3"
jak wyciągnąć tylko część daty z daty zapisanej w formacie dataczas np
mam w bazie zapisaną zmienną w formacie '2014-02-06 19:02:01' a chcę tylko pobrać z tego datę czyli '2014-02-06'

0

OK teraz jest dobrze


$dzisiaj=date("Y-m-d H:m:s"); // dzisiejsza data w formacie datetime
$result=round((strtotime($dzisiaj)-strtotime($wyn['czas']))/86400); 

gdzie $wyn['czas'] jest pobierany z bazy także w formacie datetime

wielkie dzięki za pomoc

0

odgrzewam temat bo mam jeszcze pytanie.
otóż po komendzie

$result=round((strtotime($dzisiaj)-strtotime($wyn['czas']))/86400;

czasami wychodzą mi wartości ujemna, przypuszczam że jest to różnica w dacie na serwerze www i bazy danych
ale przy porównaniu

switch($result)
{
case ($result<=1):
   echo 'udalo sie';
   break;

}

i mam taki przypadek kiedy $result=-0 lub =0 bo wyświetlam go sobie poleceniem echo
i nie wyswietla się komunikat "udało się"

pytanie dlaczego ?
i drugie pytanie jakiego formatu jest zmienna $result ? czy to jest int ? czy real ? a może jeszcze coś innego

0

var_dump($result); wyswietli zawartosc zmiennej oraz typ. W tym przypadku jest to int. Jezeli baza danych i PHP stoja na tej samej maszynie, to raczej zwracaja ten sam czas. Byc moze w konfiguracji PHP ustawiona jest inna strefa czasowa?

0

round() zastosuj sobie do całości, bo teraz robisz coś w rodzaju round($obliczenia)/86400 - zapewne dzielisz zero bądź wartości blisko zera przez 86400 i powstają jakieś ułameczki, które powodują to całe "-0".

0

round() tyczy się całego wyrażenia, źle napisałem.
sprawdziłem poleceniem var_dump($result); i typ zmiennej jest float ale w dalszym ciągu nie wiem dlaczego przy wartości -0 na stronie pojawia mi się komunikat który jest przypisany do warunku
case ($result>7 && $result<=14) a nie ten komunikat który jest przypisany do warunku case ($result<=7) ???????

0

Dlatego że używasz switcha w nietypowy sposób, wydaje mi się że nie do końca rozumiesz jego działanie. w ten sposób powinieneś napisać if... elseif... elseif... else. Switch dla takiego przykładu

switch ($foo) {
case ($bar):
    echo 'a';
break;
default:
    echo 'b';
break;
}

porówna wartość $foo z $bar. u Ciebie $bar = -0, a $foo = ($result > 7 && $result <= 14). Zbiegiem okoliczności w PHP -0 == (-0 > 7 && -0 <=14), bo obydwa są logicznie fałszywe (tzn -0 == false i wyrażenie z nawiasu == false). stąd switch wchodzi w tego case'a :)
Mam nadzieję że napisałem to zrozumiale ;)

0

tak dla wyczerpania tematu. Ostatnio natrafiłem na info o tym na stronie
http://sqlserverdlaopornych.w[...]prezentacja-wynikow-w-dniach/
zamiast robić odejmowanie dat po stronie PHP można też zrobić to samo po stornie SQLa. Ten sposób wydał mi się łatwiejszy stąd ten post jeśli ktoś chciałby skorzystać :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0