$ 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?


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"));

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!


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));


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;

6

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

<?php (date('Y')+1).date('-m-d'); ?>

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 :)


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');

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()

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.


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));

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."";

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);

-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 :)

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.