2013-07-31 14 views
9

moja forma ma 2 Fields - Time_from i Time_toDateTime dodać 1 dzień

teraz muszę dodać wpis w mojej bazy danych dla każdego dnia (jeśli tam jest różnica między tymi dni) ex. Time_from = 26.08.2013 08:00:00 i Time_to = 28.08.2013 16:00:00 Więc w mojej bazy danych i powinien dostać 3 wpisy

Time_from = 2013-08-26 08:00:00 and Time_to = 2013-08-26 16:00:00 
Time_from = 2013-08-27 08:00:00 and Time_to = 2013-08-27 16:00:00 
Time_from = 2013-08-28 08:00:00 and Time_to = 2013-08-28 16:00:00 

Więc w tym celu zrobiłem Metoda, w której najpierw znajduję różnicę między tymi dwiema datami, a następnie używam pętli for, która będzie działać przez tyle dni w różnicy tych dwóch dat, a na końcu im właśnie dodaję 1 dzień.

public function createOffer($offer) 
{ 
$time_from = new DateTime($offer->time_from); 
$time_to = new DateTime($offer->time_to); 
$interval = $time_from->diff($time_to); 

for ($counter = 0; $counter <= $interval->d; $counter++) { 
    $offer->time_from = $time_from->format('Y-m-d H:i:s'); 
    $offer_time_to = new DateTime($time_from->format('Y-m-d')); 
    $offer_time_to->setTime($time_to->format('H'), $time_to->format('i') 
     , $time_to->format('s')); 
    $offer->time_to = $offer_time_to->format('Y-m-d H:i:s'); 

    if ($offer->validate()) { 
    $offer->save(); 
    } 

    date_modify($time_from, '+1 day'); 
    } 
} 

Z jakiegoś powodu kod nie działa.

Kiedy usunąć pole date_modify tylko pierwszy dzień zostanie zapisany w mojej bazy danych (Guess dla pętli działa tylko raz potem)

Ale z date_modify w moim kodzie, tylko ostatni dzień jest zapisana w baza danych.

+0

$ interval-> d nie ma „dzień” różnica, tylko godziny, w czasach podane więc pętla będzie działać tylko raz – Anigel

+0

więc różnicę między dniami jest pokazywany tylko w godz.? – CreamYGEEK

+0

http://phpfiddle.org/main/code/3r1-6hc czy na pewno nie chcesz $ interwał-> h zamiast interwału-> d – Anigel

Odpowiedz

21

można użyć funkcji Dodaj od DATATIME obiektu

tutaj daję wam jeden przykład, aby dodać jeden 1 w dacie postu jak

<?php 
$date = new DateTime('2000-01-01'); 
$date->add(new DateInterval('P1D')); 
echo $date->format('Y-m-d') . "\n"; 
?> 

WYJŚCIE

2000-01-02 

Nadziei to na pewno pomoże ci rozwiązać twój problem.

+0

Ciągle otrzymuję ten sam wynik, tylko ostatni dzień jest zapisany w bazie danych . – CreamYGEEK

+0

proszę śledzić datę, zanim przejdziesz do nowego DateTime ("twoja data"); a twoja funkcja powinna być zwracana za każdym razem, gdy nowa data oznacza 3 razy, że musisz zadzwonić lub zwrócić wartość z funkcji. – liyakat

+0

Twoje rozwiązanie wydaje się działać. Najwyraźniej jest problem z Jquery, który jest odpowiedzialny za błąd .. – CreamYGEEK

2
$date = new DateTime('2017-01-17'); 
$date->modify('+1 day'); 

echo $date->format('Y-m-d'); // 2017-01-18 

Można zrobić też:

$dateTo = new \DateTime('1980-12-07 +1 day'); 
echo $dateTo->format('Y-m-d'); // 1980-12-08