在php中添加日期会给出不同的结果

The*_*jas 9 php mysql datetime date

我必须在特定日期添加6个月的日期.我使用了以下代码

$start_date = "2016-08-30";
$end_date= date( "Y-m-d", strtotime( "$start_date +6 months" ) );
echo $end_date;
Run Code Online (Sandbox Code Playgroud)

结果为2017-03-02
然后我在代码中更改了开始日期,如下所示

$start_date = "2016-09-01";
$end_date= date( "Y-m-d", strtotime( "$start_date +6 months" ) );
echo $end_date;
Run Code Online (Sandbox Code Playgroud)

2017-03-01给出的结果
为什么这首先发生?我的代码有什么问题吗?
使用Mysql查询

SELECT DATE_ADD('2016-08-30', INTERVAL 6 MONTH)
Run Code Online (Sandbox Code Playgroud)

给出结果2017-02-28
哪个是获得正确日期的正确解决方案?

zak*_*ron 4

这是由于 PHP 的行为而发生的。在本例中,添加 6 个月,即为二月(有 28 天),因此又添加了三天,但在 MySQL 中,它仅添加了几个月。

为了解决这个问题,使用last day of 6 monthlast day of sixth month代替+6 months

代码

$date = new DateTime( '2016-08-30' );
echo $date->format( 'Y-m-d' ), "\n";
$date->modify( 'last day of sixth month' );
echo $date->format( 'Y-m-d' ), "\n";
Run Code Online (Sandbox Code Playgroud)

代码演示

输出

2016-08-30
2017-02-28
Run Code Online (Sandbox Code Playgroud)

另一种解决方案

$date = new DateTime( '2016-08-25' );
echo $date->format('Y-m-d'),"\n";
$day = $date->format('j');
$date->modify('first day of sixth month');
$date->modify('+' . (min($day, $date->format('t')) - 1) . ' days');
echo $date->format('Y-m-d');
Run Code Online (Sandbox Code Playgroud)

代码演示

输出

2016-08-25
2017-02-25
Run Code Online (Sandbox Code Playgroud)

另请参阅相对格式