Note: This method modifies the object in-place. So if you want to calculate a new date but assign the new value to a different object, this will NOT work:
<?php
$numMinutes = 25;
$oDateA = new DateTime('2012-01-01 12:00:00');
print "
Original:<br>
oDateA = {$oDateA->format('Y-m-d H-i-s')}<br>
";
$oDateB = $oDateA->modify ("+{$numMinutes} minutes");
print "
plus {$numMinutes} minutes:<br>
oDateA = {$oDateA->format('Y-m-d H-i-s')}<br>
oDateB = {$oDateB->format('Y-m-d H-i-s')}<br>
";
?>
...produces this:
oDateA = 2012-01-01 12-00-00
plus 25 minutes:
oDateA = 2012-01-01 12-25-00
oDateB = 2012-01-01 12-25-00
Use something like this instead:
<?php
$numMinutes = 25;
$oDateA = new DateTime('2012-01-01 12:00:00');
print "
<p>
Original:<br>
oDateA = {$oDateA->format('Y-m-d H-i-s')}<br>
";
$oDateB = clone $oDateA;
$oDateB->modify ("+{$numMinutes} minutes");
print "
plus {$numMinutes} minutes:<br>
oDateA = {$oDateA->format('Y-m-d H-i-s')}<br>
oDateB = {$oDateB->format('Y-m-d H-i-s')}<br>
";
?>
... produces this:
oDateA = 2012-01-01 12-00-00
plus 25 minutes:
oDateA = 2012-01-01 12-00-00
oDateB = 2012-01-01 12-25-00
DateTime::modify
date_modify
(PHP 5 >= 5.2.0)
DateTime::modify -- date_modify — Modifie le timestamp
Description
Style orienté objet
Style procédural
Modifie le timestamp d'un objet DateTime en l'incrémentant ou le décrémentant dans un format acceptable par strtotime().
Liste de paramètres
-
object -
Style procédural uniquement : Un objet DateTime retourné par la fonction date_create(). Cette fonction modifie cet objet.
-
modify -
Une chaîne date/heure. Les formats valides sont expliqués dans la documentation sur les formats Date et Heure.
Valeurs de retour
Retourne l'objet DateTime pour chainer les méthodes ou FALSE si une erreur survient.
Historique
| Version | Description |
|---|---|
| 5.3.6 | Les requêtes date/heure absolues prennent maintenant effets. Auparavant, seules les parties relatives étaient utilisées. |
| 5.3.0 | Changement de
valeur de retour de NULL à DateTime en cas de succès. |
Exemples
Exemple #1 Exemple avec DateTime::modify()
Style orienté objet
<?php
$date = new DateTime('2006-12-12');
$date->modify('+1 day');
echo $date->format('Y-m-d');
?>
Style procédural
<?php
$date = date_create('2006-12-12');
date_modify($date, '+1 day');
echo date_format($date, 'Y-m-d');
?>
Les exemples ci-dessus vont afficher :
2006-12-13
Exemple #2 Méfiez-vous lors de l'ajout ou la soustraction de mois
<?php
$date = new DateTime('2000-12-31');
$date->modify('+1 month');
echo $date->format('Y-m-d') . "\n";
$date->modify('+1 month');
echo $date->format('Y-m-d') . "\n";
?>
L'exemple ci-dessus va afficher :
2001-01-31 2001-03-03
Voir aussi
- strtotime() - Transforme un texte anglais en timestamp
- DateTime::add() - Ajoute une durée à un objet DateTime
- DateTime::sub() - Soustrait une durée à un objet DateTime
- DateTime::setDate() - Assigne la date
- DateTime::setISODate() - Configure une date ISO
- DateTime::setTime() - Assigne l'heure
- DateTime::setTimestamp() - Assigne la date et l'heure à l'aide d'un timestamp Unix
These functions makes sure that adding months or years always ends up in the month you would expect. Works for positive and negative values
<?php
$date=new DateTime();
$date->setDate(2008,2,29);
function addMonths($date,$months){
$init=clone $date;
$modifier=$months.' months';
$back_modifier =-$months.' months';
$date->modify($modifier);
$back_to_init= clone $date;
$back_to_init->modify($back_modifier);
while($init->format('m')!=$back_to_init->format('m')){
$date->modify('-1 day') ;
$back_to_init= clone $date;
$back_to_init->modify($back_modifier);
}
/*
if($months<0&&$date->format('m')>$init->format('m'))
while($date->format('m')-12-$init->format('m')!=$months%12)
$date->modify('-1 day');
else
if($months>0&&$date->format('m')<$init->format('m'))
while($date->format('m')+12-$init->format('m')!=$months%12)
$date->modify('-1 day');
else
while($date->format('m')-$init->format('m')!=$months%12)
$date->modify('-1 day');
*/
}
function addYears($date,$years){
$init=clone $date;
$modifier=$years.' years';
$date->modify($modifier);
while($date->format('m')!=$init->format('m'))
$date->modify('-1 day');
}
addMonths($date,-1);
addYears($date,3);
echo $date->format('F j,Y');
?>
If you want to find the next working day (assuming mon-fri) you can use this:
<?php
$d = new DateTime();
$day = $d->format('w');
if ($day == 0 || $day >= 5) $d->modify('+' . ((7-$day+1) % 7) . ' days');
else $d->modify('+1 day');
?>
