$ date + 1 an?

87

J'essaie d'obtenir une date qui est d'un an à partir de la date que je précise.

Mon code ressemble à ceci:

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

Il renvoie la mauvaise date. Des idées pourquoi?

Mat
la source
9
Vous avez oublié de parler de l'erreur.
BalusC
Frank Farmer: êtes-vous si sûr? Je préfère attendre les retifications / commentaires d'OP.
BalusC
Dans ma hâte de poster cela hier soir, j'ai oublié de clarifier - il retournait la mauvaise date. Pardon! Merci de votre aide.
Matt
1
Utilisez-le comme ceci à la place strtotime ('+ 1 an', $ startDate));
casivaagustin le

Réponses:

97

Pour ajouter un an à la date d'aujourd'hui, utilisez ce qui suit:

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

Pour les autres exemples, vous devez initialiser $ StartingDate avec une valeur d'horodatage par exemple:

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

Essaye ça

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

ou

$newEndingDate = date("Y-m-d", strtotime(date("Y-m-d", strtotime($StaringDate)) . " + 1 year"));
Bébé Nidhin
la source
L'ajout de "+365" au lieu de "+1 an" l'a fait. Merci!
Matt
16
Cela ne ferait-il pas une pause en cas d'année bissextile?
Jeremy1026
1
Depuis PHP 5.1, lorsqu'il est appelé sans argument, mktime () lance un avis E_STRICT: utilisez la fonction time () à la place.
svandragt
Voté ici aussi. Le nombre de secondes dans une journée, de jours dans une année, de secondes dans une année, etc. sont tous variables. Si vous êtes intéressé par «dans un an», vous devez passer dans un intervalle de «un an». La subdivision par vous-même est ce qui conduit à des erreurs autour des jours bissextiles et des secondes intercalaires et des changements d'heure d'été. Pire encore, cela provoque des tests unitaires flappy.
drobert
pourquoi ma réponse est déclinée ?? $ addedoneyear = date ("y") + 1; // pour avoir ajouté un an, qu'est-ce qui ne va pas avec ça?
pathe.kiran
212
$futureDate=date('Y-m-d', strtotime('+1 year'));

$ futureDate est dans un an!

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

$ futureDate est un an à partir du $ startDate!

Misho
la source
Veuillez noter que si $ startDate est déjà un horodatage (comme celui créé plus tôt avec la fonction time () ou mktime ()) et non une chaîne, vous ne devriez pas l'envelopper dans strtotime ou cela ne fonctionnera pas. Au lieu de cela, faites $futureDate=date('Y-m-d',strtotime('+1 year',$startDate));comme K Prime mentionné ci-dessous.
dallin le
9

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

K Prime
la source
Bien que cela renvoie la bonne réponse, l'autre ne renvoie pas non plus d'erreur ... juste la mauvaise date.
SeanJA
1
strtotime ne renvoie pas d'erreurs. Il renvoie false en cas d'erreur.
Frank Farmer
PHP lancera des avertissements si le fuseau horaire par défaut n'est pas défini ... bien qu'apparemment ce n'est pas ce qu'il voulait dire
SeanJA
Je devenais erreur sur votre code je l' ai changé ,pour .et cela a fonctionné date("Y-m-d",strtotime('+1 year '.$startDate));
Muhammad Bilal le
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;
Anarchie
la source
6

avait juste le même problème, mais c'était la solution la plus simple:

<?php (date('Y')+1).date('-m-d'); ?>
Gardenee
la source
Super, je l' utiliser pour obtenir l'année prochaine: $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'));

J'espère que ce morceau de code plus simple aidera quelqu'un à l'avenir :)

Développeur
la source
4

Je préfère l'approche OO:

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

À utiliser DateTimeImmutablesinon vous modifierez aussi la date d'origine! plus sur DateTimeImmutable: http://php.net/manual/en/class.datetimeimmutable.php


Si vous voulez juste la date d'aujourd'hui, vous pouvez toujours faire:

new \DateTimeImmutable('-1 Month');
Andrew Atkinson
la source
3

Si vous utilisez PHP 5.3, c'est parce que vous devez définir le fuseau horaire par défaut:

date_default_timezone_set()
SeanJA
la source
3

strtotime()est de retour bool(false), car il ne peut pas analyser la chaîne '+one year'(il ne comprend pas "un"). falseest alors implicitement converti en integerhorodatage 0. C'est une bonne idée de vérifier que strtotime()la sortie n'est pas bool(false)avant de la pousser dans d'autres fonctions.

À partir de la documentation:

Valeurs de retour

Renvoie un horodatage en cas de succès, FALSE sinon. Avant PHP 5.1.0, cette fonction renverrait -1 en cas d'échec.

Frank Farmer
la source
Ouais, bon point. Mon code de production l'aura, mais je m'arrachais les cheveux en essayant de faire fonctionner cela, alors je l'ai réduit au minimum de code. Merci!
Matt
2

Essaye ça

$nextyear  = date("M d,Y",mktime(0, 0, 0, date("m",strtotime($startDate)),   date("d",strtotime($startDate)),   date("Y",strtotime($startDate))+1));
Treby
la source
1

Il existe également une solution plus simple et moins sophistiquée:

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

Ma solution est: date('Y-m-d', time()-60*60*24*365);

Vous pouvez le rendre plus "lisible" avec définit:

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
la source
-1

Dans mon cas (je veux ajouter 3 ans à la date actuelle), la solution était:

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

À Gardenee, Treby et Daniel Lima: que se passera-t-il avec le 29 février? Parfois, février ne compte que 28 jours :)

aiuen
la source