$ data + 1 rok?

91

Próbuję ustalić datę, która jest rok od daty określonej przeze mnie.

Mój kod wygląda tak:

$futureDate=date('Y-m-d', strtotime('+one year', $startDate));

Zwraca niewłaściwą datę. Jakieś pomysły, dlaczego?

Matt
źródło
9
Zapomniałeś powiedzieć o błędzie.
BalusC
Frank Farmer: czy jesteś taki pewien? Wolałabym poczekać na retification / komentarze OP.
BalusC
W pośpiechu, aby opublikować tę ostatnią noc, zapomniałem wyjaśnić - to była zła data. Przepraszam! Dzięki za pomoc.
Matt,
1
Zamiast tego użyj go w ten sposób strtotime ('+ 1 rok', $ startDate));
casivaagustin

Odpowiedzi:

98

Aby dodać jeden rok do dzisiejszej daty, użyj:

$oneYearOn = date('Y-m-d',strtotime(date("Y-m-d", mktime()) . " + 365 day"));

W przypadku innych przykładów musisz zainicjować $ StartingDate wartością datownika, na przykład:

$StartingDate = mktime();  // todays date as a timestamp

Spróbuj tego

$newEndingDate = date("Y-m-d", strtotime(date("Y-m-d", strtotime($StaringDate)) . " + 365 day"));

lub

$newEndingDate = date("Y-m-d", strtotime(date("Y-m-d", strtotime($StaringDate)) . " + 1 year"));
Nidhin Baby
źródło
Dodanie „+365” zamiast „+1 rok” wystarczyło. Dzięki!
Matt
17
Czy nie przerwałoby to w przypadku roku przestępnego?
Jeremy1026
1
Od PHP 5.1, gdy jest wywoływana bez argumentów, mktime () generuje powiadomienie E_STRICT: zamiast tego użyj funkcji time ().
svandragt
Tutaj też przegłosowano. Liczba sekund w ciągu dnia, dni w roku, sekundy w roku itd. Są zmienne. Jeśli interesuje Cię „jeden rok od teraz”, musisz przejść w odstępie „jeden rok”. Samodzielne dzielenie prowadzi do błędów związanych z dniami przestępnymi i sekundami przestępnymi oraz zmianami czasu letniego. Co gorsza, powoduje flappy jednostkowe testy.
drobert
dlaczego moja odpowiedź jest odrzucona? $ addedoneyear = data ("y") + 1; // za dodanie jednego roku, co w tym złego?
pathe.kiran
215
$futureDate=date('Y-m-d', strtotime('+1 year'));

$ futureDate jest za rok od teraz!

$futureDate=date('Y-m-d', strtotime('+1 year', strtotime($startDate)) );

$ futureDate jest o rok od $ startDate!

Misho
źródło
Zwróć uwagę, że jeśli $ startDate jest już znacznikiem czasu (takim jak utworzony wcześniej za pomocą funkcji time () lub mktime ()), a nie ciągiem znaków, nie powinieneś zawijać go w strtotime, bo to nie zadziała. Zamiast tego zrób $futureDate=date('Y-m-d',strtotime('+1 year',$startDate));tak , jak wspomniano poniżej K Prime.
dallin
9

Próbować: $futureDate=date('Y-m-d',strtotime('+1 year',$startDate));

K Prime
źródło
Chociaż to zwraca właściwą odpowiedź, druga w rzeczywistości również nie zwraca błędu ... tylko zła data.
SeanJA
1
strtotime nie zgłasza błędów. Zwraca fałsz w przypadku błędu.
Frank Farmer
PHP wyrzuci ostrzeżenia, jeśli domyślna
strefa
Byłem coraz błąd w kodzie zmieniłem ,się .i pracował date("Y-m-d",strtotime('+1 year '.$startDate));
Muhammad Bilal
7
// Declare a variable for this year 
$this_year = date("Y");
// Add 1 to the variable
$next_year = $this_year + 1;
$year_after = $this_year + 2;

// Check your code
    echo "This year is ";
    echo $this_year;
    echo "<br />";
    echo "Next year is ";
    echo $next_year;
    echo "<br />";
    echo "The year after that is ";
    echo $year_after;
AnarchiaOutlaw
źródło
6

miałem tylko ten sam problem, ale to było najprostsze rozwiązanie:

<?php (date('Y')+1).date('-m-d'); ?>
Gardenee
źródło
Wielki, używam go dostać następny rok $next_year = (date('Y')+1).
Martin,
5
//1 year from today's date
echo date('d-m-Y', strtotime('+1 year'));

//1 year from from specific date
echo date('22-09-Y', strtotime('+1 year'));

mam nadzieję, że ten prostszy fragment kodu pomoże komuś w przyszłości :)

Deweloper
źródło
4

Wolę podejście OO:

$date = new \DateTimeImmutable('today'); //'today' gives midnight, leave blank for current time.
$futureDate = $date->add(\DateInterval::createFromDateString('+1 Year'))

W DateTimeImmutableprzeciwnym razie zmodyfikujesz również oryginalną datę! więcej na temat DateTimeImmutable: http://php.net/manual/en/class.datetimeimmutable.php


Jeśli chcesz tylko od dzisiejszej daty, zawsze możesz zrobić:

new \DateTimeImmutable('-1 Month');
Andrew Atkinson
źródło
3

Jeśli używasz PHP 5.3, dzieje się tak, ponieważ musisz ustawić domyślną strefę czasową:

date_default_timezone_set()
SeanJA
źródło
3

strtotime()zwraca bool(false), ponieważ nie może przeanalizować ciągu '+one year'(nie rozumie „jeden”). falsejest następnie niejawnie rzutowany na integerznacznik czasu 0. Dobrym pomysłem jest sprawdzenie strtotime(), czy dane wyjściowe nie są, bool(false)zanim przejdziesz do innych funkcji.

Z dokumentów:

Zwracane wartości

Zwraca znacznik czasu w przypadku sukcesu, w przeciwnym razie FALSE. W wersjach wcześniejszych niż PHP 5.1.0 ta funkcja zwracała -1 w przypadku błędu.

Frank Farmer
źródło
Tak, słuszna uwaga. Mój kod produkcyjny będzie to miał, ale wyrywałem sobie włosy, próbując to uruchomić, więc zredukowałem go do jak najmniejszego kodu. Dzięki!
Matt
2

Spróbuj tego

$nextyear  = date("M d,Y",mktime(0, 0, 0, date("m",strtotime($startDate)),   date("d",strtotime($startDate)),   date("Y",strtotime($startDate))+1));
Treby
źródło
1

Jest też prostsze i mniej wyszukane rozwiązanie:

$monthDay = date('m/d');
$year = date('Y')+1;
$oneYearFuture = "".$monthDay."/".$year."";
echo"The date one year in the future is: ".$oneYearFuture."";
Daniel Lima
źródło
1

Moje rozwiązanie to: date('Y-m-d', time()-60*60*24*365);

Możesz uczynić go bardziej „czytelnym” za pomocą definicji:

define('ONE_SECOND', 1);
define('ONE_MINUTE', 60 * ONE_SECOND);
define('ONE_HOUR',   60 * ONE_MINUTE);
define('ONE_DAY',    24 * ONE_HOUR);
define('ONE_YEAR',  365 * ONE_DAY);

date('Y-m-d', time()-ONE_YEAR);
Adam Mester
źródło
-1

W moim przypadku (chcę dodać 3 lata do obecnej daty) rozwiązaniem było:

$future_date = date('Y-m-d', strtotime("now + 3 years"));

Do Gardenee, Treby'ego i Daniela Limy: co się stanie z 29 lutego? Czasami luty ma tylko 28 dni :)

aiuen
źródło