Ajouter un jour à une date


172

Mon code pour ajouter un jour à une date renvoie une date avant le jour en ajoutant: la 2009-09-30 20:24:00date après l'ajout d'un jour DEVRAIT être reportée au mois suivant: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;
?>

J'ai déjà utilisé un code assez similaire, qu'est-ce que je fais de mal ici?

Réponses:


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

Pour PHP 5.2.0+, vous pouvez également procéder comme suit:

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

3
Merci. Résolu comme suit: $ stop_date = date ('Ymd H: i: s', strtotime ("$ stop_date + 1 day"));
ian

11
Vous ne devez pas utiliser de variable dans une chaîne. Vous devez utiliser: date('Y-m-d H:i:s', strtotime($stop_date . ' + 1 day'));comme dans la réponse que @ w35l3y vous a donnée.
Cas Bloem

Vous devez ajouter un appel à la fonction date_default_timezone_set avant d'exécuter ce code. Par exemple, ajoutez date_default_timezone_set ('Europe / Rome');
Luca Mastrostefano

96
$date = new DateTime('2000-12-31');

$date->modify('+1 day');
echo $date->format('Y-m-d') . "\n";

6
C'est une solution plus récente - parfaite -.
Cas Bloem

... Tant que cela ne provoque pas d'erreurs fatales lorsqu'il est exécuté sur votre hôte;)
Henrik Erlandsson

Ne vous excusez pas. Certaines personnes ont publié la réponse de la dame 3 ans après vous
Mawg dit de réintégrer Monica le

1
Vous devez ajouter un appel à la fonction date_default_timezone_set avant d'exécuter ce code. Par exemple, ajoutez date_default_timezone_set ('Europe / Rome');
Luca Mastrostefano

@LucaMastrostefano non, vous devriez avoir le fuseau horaire réglé sur votre serveur ...
MH

28

Solution la plus simple:

$date = new DateTime('+1 day');
echo $date->format('Y-m-d H:i:s');

J'aime votre chemin dans un one linerecho (new DateTime('+1 day'))->format('Y-m-d H:i:s');
Aba

@Aba Je ne pense pas que votre doublure fonctionne dans les anciennes versions de PHP car je l'ai essayé et j'ai eu une erreur:Unexpected T_OBJECT_OPERATOR” error in PHP
Zachary Weixelbaum

25

Cela a fonctionné pour moi: pour la date actuelle

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

pour n'importe quelle date:

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

2
merci cela a fonctionné pour moi. La plus simple de toutes les solutions données.
Puneet Verma

2
vous n'avez pas besoin de répéter et d'imbriquer strtotime()- il peut tout gérer en un seul appel:date('Y-m-d', strtotime($date . " +1 day"));
billynoah

2
Sympa, c'est la solution la plus simple! Merci
Angel


6

Manière simple à lire et à comprendre:

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

3
Cela échouera parfois lors des changements d'heure d'été lorsque la durée du jour n'est pas de 24 heures.
Nik Dow

3

J'ajoute toujours juste 86400 (secondes dans un jour):

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

Ce n'est pas la façon la plus astucieuse de le faire, mais ça marche!


Comment gérez-vous les secondes intercalaires lorsque l'ajout de 86400 ne fonctionnera pas car il y a 86401 secondes ce jour-là? (ok, je sais que cela n'arrive que toutes les quelques années, mais selon l'application, cela peut être important)
Glen

1
Tous les jours ne contiennent pas 86400 secondes. En fait, dans la plupart des endroits aux États-Unis, il y a 3 600 secondes de moins ou de plus deux fois par an.
Peter Kovacs le

1
Vous pouvez ignorer en toute sécurité les secondes intercalaires, comme le fait «l'heure Unix». C'est un peu compliqué, mais lisez cet article pour plus d'informations: derickrethans.nl/leap_seconds_and_what_to_do_with_them.php
Christian Davén

2
Vous devez éviter cette solution. Voici pourquoi: stackoverflow.com/questions/2613338/…
mspir

1
N'ajoutez pas de date en ajoutant 86400 secondes au jour précédent! Vous aurez un bug dans votre code! Cela ne fonctionne pas les jours d'été!
sbrbot

1

Bien que je sois d'accord avec la réponse de Doug Hays, je vais dire ici que la raison pour laquelle votre code ne fonctionne pas est que strtotime () attend un INT comme 2ème argument, pas une chaîne (même une qui représente une date)

Si vous activez le rapport d'erreur max, vous verrez cela comme une erreur "Une valeur numérique non bien formée" qui est de niveau E_NOTICE.


1

La modify()méthode qui peut être utilisée pour ajouter des incréments à une DateTimevaleur existante .

Créez un nouvel DateTimeobjet avec la date et l'heure actuelles:

$due_dt = new DateTime();

Une fois que vous avez l' DateTimeobjet, vous pouvez manipuler sa valeur en ajoutant ou en soustrayant des périodes:

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

Vous pouvez en savoir plus sur le manuel PHP .


0

Le code suivant récupère le premier jour de janvier de l'année en cours (mais il peut s'agir d'une autre date) et ajoute 365 jours à ce jour (mais cela peut être N nombre de jours) en utilisant la classe DateTime et sa méthode modify () et format ( ):

echo (new DateTime((new DateTime())->modify('first day of January this year')->format('Y-m-d')))->modify('+365 days')->format('Y-m-d');

0

Puisque vous avez déjà une réponse à ce qui ne va pas avec votre code, je peux apporter une autre perspective sur la façon dont vous pouvez jouer avec les datetimes en général et résoudre votre problème en particulier.

Souvent, vous vous trouvez poser un problème en termes de solution. Ce n'est qu'une des raisons pour lesquelles vous vous retrouvez avec un code impératif . C'est génial si cela fonctionne cependant; il existe juste d'autres alternatives, sans doute plus faciles à maintenir. L'un d'eux est un code déclaratif . Le but est de vous demander ce dont vous avez besoin, au lieu de savoir comment vous y rendre.

Dans votre cas particulier, cela peut ressembler à ce qui suit. Tout d'abord, vous devez savoir ce que vous recherchez, c'est-à-dire découvrir des abstractions. Dans votre cas, il semble que vous ayez besoin d'une date . Pas n'importe quelle date, mais celle ayant une représentation standard. Dites, date ISO8601. Il existe au moins deux implémentations: la première est une date analysée à partir d'une chaîne au format ISO8601 (ou une chaîne dans un autre format en fait), et la seconde est une date future qui est un jour plus tard. Ainsi, tout le code pourrait ressembler à ça:

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

Pour plus d'exemples de jonglage datetime, consultez celui-ci .

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.