Correction on the previous comment :
Bug fixed in php 7.0.17 and 7.1.3, for the version 7.0.0 to 7.0.16 and 7.1.0 to 7.1.2, the bug is still present
(PHP 5 >= 5.2.0, PHP 7)
DateTime::setDate -- date_date_set — Sets the date
面向对象风格
过程化风格
Resets the current date of the DateTime object to a different date.
object
仅过程化风格:由 date_create() 返回的 DateTime 类型的对象。此函数会修改这个对象。
year
Year of the date.
month
Month of the date.
day
Day of the date.
返回被修改的 DateTime 对象, 或者在失败时返回 FALSE
.
版本 | 说明 |
---|---|
5.3.0 | 将返回值从NULL 改为 DateTime 类型。 |
Example #1 DateTime::setDate() example
面向对象风格
<?php
$date = new DateTime();
$date->setDate(2001, 2, 3);
echo $date->format('Y-m-d');
?>
过程化风格
<?php
$date = date_create();
date_date_set($date, 2001, 2, 3);
echo date_format($date, 'Y-m-d');
?>
以上例程会输出:
2001-02-03
Example #2 Values exceeding ranges are added to their parent values
<?php
$date = new DateTime();
$date->setDate(2001, 2, 28);
echo $date->format('Y-m-d') . "\n";
$date->setDate(2001, 2, 29);
echo $date->format('Y-m-d') . "\n";
$date->setDate(2001, 14, 3);
echo $date->format('Y-m-d') . "\n";
?>
以上例程会输出:
2001-02-28 2001-03-01 2002-02-03
Correction on the previous comment :
Bug fixed in php 7.0.17 and 7.1.3, for the version 7.0.0 to 7.0.16 and 7.1.0 to 7.1.2, the bug is still present
Be carreful about this bug in php 5.6 and lower (fixed in php 7.0 and higher) :
<?php
$date = new DateTime("first day of last month");
echo $date->format('Y-m-d');
echo ' => ' ;
$date->setDate(2013, 2, 3);
echo $date->format('Y-m-d');
?>
Output <=5.6 : 2017-03-01 => 2013-02-01
Output >=7.0 : 2017-03-31 => 2013-02-03
Same goes for "Last day of last month", and the funny part, it will take the last day of the new month setted by setDate
Example with a Leap Year :
<?php
$date = new DateTime("last day of last month");
echo $date->format('Y-m-d');
echo ' => ' ;
$date->setDate(2012, 2, 3);
echo $date->format('Y-m-d');
?>
Output <=5.6 : 2017-03-31 => 2012-02-29
Output >=7.0 : 2017-03-31 => 2012-02-03
Be warned, DateTime::setDate() does not check for invalid input.
Illustration:
<?php
$dt = new DateTime();
$dt->setDate(2012, 11, 31); // returns DateTime object and not false although this date does not exist
echo $dt->format('Y-m-d'); // output: 2012-12-01
?>
No error was generated on entering a non existing date, php silently changed it.