Dodanie jednego dnia do daty

172

Mój kod dodania jednego dnia do daty zwraca datę przed dniem dodając: 2009-09-30 20:24:00data po dodaniu jednego dnia POWINIEN zostać przeniesiony na następny miesiąc:1970-01-01 17:33:29

<?php

    //add day to date test for month roll over

    $stop_date = date('Y-m-d H:i:s', strtotime("2009-09-30 20:24:00"));

    echo 'date before day adding: '.$stop_date; 

    $stop_date = date('Y-m-d H:i:s', strtotime('+1 day', $stop_date));

    echo ' date after adding one day. SHOULD be rolled over to the next month: '.$stop_date;
?>

Używałem wcześniej podobnego kodu, co ja tu robię źle?

Jan
źródło

Odpowiedzi:

333
<?php
$stop_date = '2009-09-30 20:24:00';
echo 'date before day adding: ' . $stop_date; 
$stop_date = date('Y-m-d H:i:s', strtotime($stop_date . ' +1 day'));
echo 'date after adding 1 day: ' . $stop_date;
?>

W przypadku PHP 5.2.0+ możesz również wykonać następujące czynności:

$stop_date = new DateTime('2009-09-30 20:24:00');
echo 'date before day adding: ' . $stop_date->format('Y-m-d H:i:s'); 
$stop_date->modify('+1 day');
echo 'date after adding 1 day: ' . $stop_date->format('Y-m-d H:i:s');
w35l3y
źródło
3
Dzięki. Rozwiązano to jako: $ stop_date = date ('Ymd H: i: s', strtotime ("$ stop_date + 1 dzień"));
ian
11
Nie powinieneś używać zmiennej w ciągu. Powinieneś użyć: date('Y-m-d H:i:s', strtotime($stop_date . ' + 1 day'));jak w odpowiedzi, którą dał ci @ w35l3y.
Cas Bloem,
Przed uruchomieniem tego kodu należy dodać wywołanie funkcji date_default_timezone_set. Na przykład add date_default_timezone_set ('Europa / Rzym');
Luca Mastrostefano
96
$date = new DateTime('2000-12-31');

$date->modify('+1 day');
echo $date->format('Y-m-d') . "\n";
Prasanth Bendra
źródło
6
Jest to nowsze - idealne - rozwiązanie.
Cas Bloem,
... o ile nie powoduje błędów krytycznych po uruchomieniu na twoim hoście;)
Henrik Erlandsson
Nie przepraszaj. Niektórzy ludzie opublikowali odpowiedź pani 3 lata po tym, jak to zrobiłaś
Mawg mówi, że przywróć Monikę
1
Przed uruchomieniem tego kodu należy dodać wywołanie funkcji date_default_timezone_set. Na przykład add date_default_timezone_set ('Europa / Rzym');
Luca Mastrostefano
@LucaMastrostefano nie, na serwerze powinna być ustawiona strefa czasowa ...
MH
28

Najprostsze rozwiązanie:

$date = new DateTime('+1 day');
echo $date->format('Y-m-d H:i:s');
minlare
źródło
Podoba mi się twoja droga w jednym liniowcuecho (new DateTime('+1 day'))->format('Y-m-d H:i:s');
Aba
@Aba Nie sądzę, żeby twój one liner działał w starszych wersjach PHP, ponieważ próbowałem i wyskoczył mi błąd:Unexpected T_OBJECT_OPERATOR” error in PHP
Zachary Weixelbaum
25

U mnie zadziałało: na aktualną datę

$date = date('Y-m-d', strtotime("+1 day"));

dla dowolnej daty:

date('Y-m-d', strtotime("+1 day", strtotime($date)));
Jay Momaya
źródło
2
dzięki, że zadziałało dla mnie. Najprostsze ze wszystkich podanych rozwiązań.
Puneet Verma
2
nie musisz powtarzać i zagnieżdżać strtotime()- poradzi sobie ze wszystkim podczas jednego połączenia:date('Y-m-d', strtotime($date . " +1 day"));
billynoah
2
Świetnie, to najprostsze rozwiązanie! Dziękuję
Anioł,
7

Spróbuj tego

echo date('Y-m-d H:i:s',date(strtotime("+1 day", strtotime("2009-09-30 20:24:00"))));
user1987095
źródło
Dzięki stary. Pomogło mi.
Vandolph Reyes
6

Prosty do odczytania i zrozumienia sposób:

$original_date = "2009-09-29";

$time_original = strtotime($original_date);
$time_add      = $time_original + (3600*24); //add seconds of one day

$new_date      = date("Y-m-d", $time_add);

echo $new_date;
joan16v
źródło
3
Czasami kończy się to niepowodzeniem w przypadku zmiany czasu letniego, gdy długość dnia nie wynosi 24 godziny.
Nik Dow
3

Zawsze po prostu dodaję 86400 (sekund dziennie):

$stop_date = date('Y-m-d H:i:s', strtotime("2009-09-30 20:24:00") + 86400);

echo 'date after adding 1 day: '.$stop_date; 

To nie jest najsprytniejszy sposób, w jaki prawdopodobnie możesz to zrobić, ale działa!

Doug Hays
źródło
Jak radzisz sobie z sekundami przestępnymi, gdy dodanie 86400 nie zadziała, ponieważ w tym dniu jest 86401 sekund? (ok, wiem, że zdarza się to tylko co kilka lat, ale w zależności od aplikacji może to być ważne)
Glen
1
Nie wszystkie dni mają w sobie 86400 sekund. W rzeczywistości w większości miejsc w USA jest o 3600 mniej lub więcej sekund dwa razy w roku.
Peter Kovacs
1
Możesz bezpiecznie zignorować sekundy przestępne, ponieważ „czas uniksowy” tak. Jest to nieco skomplikowane, ale przeczytaj ten artykuł, aby uzyskać więcej informacji: derickrethans.nl/leap_seconds_and_what_to_do_with_them.php
Christian Davén
2
Powinieneś unikać tego rozwiązania. Oto dlaczego: stackoverflow.com/questions/2613338/ ...
mspir
1
Nie dodawaj daty dodając 86400 sekund do poprzedniego dnia! Będziesz mieć błąd w swoim kodzie! To nie działa w dni letnie!
sbrbot
1

Chociaż zgadzam się z odpowiedzią Douga Haysa, wezmę tutaj, aby powiedzieć, że powodem, dla którego twój kod nie działa, jest to, że strtotime () oczekuje INT jako drugiego argumentu, a nie łańcucha (nawet takiego, który reprezentuje datę)

Jeśli włączysz maksymalne raportowanie błędów, zobaczysz to jako błąd „Nieprawidłowa wartość liczbowa”, który jest na poziomie E_NOTICE.

Peter Bailey
źródło
1

modify()Metoda, która może być używana do dodawania przyrosty do istniejącej DateTimewartości.

Utwórz nowy DateTimeobiekt z aktualną datą i godziną:

$due_dt = new DateTime();

Gdy już masz DateTimeobiekt, możesz manipulować jego wartością, dodając lub odejmując okresy:

$due_dt->modify('+1 day');

Możesz przeczytać więcej w podręczniku PHP .

Kal
źródło
0

Poniższy kod pobiera pierwszy dzień stycznia bieżącego roku (ale może to być inna data) i dodaje 365 dni do tego dnia (ale może to być N liczba dni) przy użyciu klasy DateTime i jej metody modified () i format ( ):

echo (new DateTime((new DateTime())->modify('first day of January this year')->format('Y-m-d')))->modify('+365 days')->format('Y-m-d');
Carlos Espinoza
źródło
0

Ponieważ masz już odpowiedź na pytanie, co jest nie tak z Twoim kodem, mogę przedstawić inną perspektywę, w jaki sposób możesz ogólnie bawić się czasami dat i konkretnie rozwiązać Twój problem.

Często zdarza się, że stwarzasz problem dotyczący rozwiązania. To tylko jeden z powodów, dla których otrzymujesz kod imperatywny . Ale to świetnie, jeśli działa; istnieją tylko inne, prawdopodobnie łatwiejsze w utrzymaniu alternatywy. Jednym z nich jest kod deklaratywny . Chodzi o to, aby zapytać, czego potrzebujesz, a nie jak się tam dostać.

W Twoim przypadku może to wyglądać następująco. Po pierwsze, trzeba dowiedzieć się, co to jest, że szukasz, to znaczy odkryć abstrakcje. W twoim przypadku wygląda na to, że potrzebujesz randki . Nie byle jaką datę, ale taką, która ma jakieś standardowe przedstawienie. Powiedzmy, data ISO8601. Istnieją co najmniej dwie implementacje: pierwsza to data przeanalizowana z ciągu w formacie ISO8601 (lub w rzeczywistości ciąg w jakimkolwiek innym formacie), a druga to jakaś przyszła data, która jest dzień później. Zatem cały kod mógłby wyglądać tak:

(new Future(
    new DateTimeParsedFromISO8601('2009-09-30 20:24:00'),
    new OneDay()
))
    ->value();

Więcej przykładów z żonglerką datetime, sprawdź ten .

Vadim Samokhin
źródło