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 — Alters the timestamp
Beschreibung
Objektorientierter Stil
Prozeduraler Stil
Alter the timestamp of a DateTime object by incrementing or decrementing in a format accepted by strtotime().
Parameter-Liste
-
object -
Nur bei prozeduralem Aufruf: Ein von date_create() zurückgegebenes DateTime-Objekt. Diese Funktion verändert dieses Objekt.
-
modify -
Ein Datums/Zeit Zeichenkette. Gültige Formate werden unter Datums- und Zeitformate erläutert.
Rückgabewerte
Gibt das DateTime-Objekt
für die Verkettung von Methoden zurück Im Fehlerfall wird FALSE zurückgegeben.
Changelog
| Version | Beschreibung |
|---|---|
| 5.3.6 | Absolute date/time statements now take effect. Previously, only relative parts were used. |
| 5.3.0 | Der
Rückgabewert bei Erfolg wurde von NULL auf DateTime
geändert. |
Beispiele
Beispiel #1 DateTime::modify() example
Objektorientierter Stil
<?php
$date = new DateTime('2006-12-12');
$date->modify('+1 day');
echo $date->format('Y-m-d');
?>
Prozeduraler Stil
<?php
$date = date_create('2006-12-12');
date_modify($date, '+1 day');
echo date_format($date, 'Y-m-d');
?>
Die obigen Bespiele erzeugen folgende Ausgabe:
2006-12-13
Beispiel #2 Beware when adding or subtracting months
<?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";
?>
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
2001-01-31 2001-03-03
Siehe auch
- strtotime() - Wandelt ein beliebiges in englischer Textform angegebenes Datum in einen UNIX-Zeitstempel (Timestamp) um
- DateTime::add() - Adds an amount of days, months, years, hours, minutes and seconds to a DateTime object
- DateTime::sub() - Subtracts an amount of days, months, years, hours, minutes and seconds from a DateTime object
- DateTime::setDate() - Sets the date
- DateTime::setISODate() - Sets the ISO date
- DateTime::setTime() - Sets the time
- DateTime::setTimestamp() - Sets the date and time based on an Unix timestamp
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');
?>
