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

时间:2016-09-01 06:44:57

标签: php mysql date datetime

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

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

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

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

将结果显示为2017-03-01
为什么这发生在第一位?我的代码有什么问题吗?
使用Mysql查询

SELECT DATE_ADD('2016-08-30', INTERVAL 6 MONTH)

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

2 个答案:

答案 0 :(得分: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";

Code Demo

<强>输出

2016-08-30
2017-02-28

另一种解决方案

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

Code Demo

<强>输出

2016-08-25
2017-02-25

另请参阅Relative Formats

答案 1 :(得分:0)

这个功能不会像人们想象的那样从左到右工作。此函数将整个字符串解析,然后按大小(年,月,...)应用间隔。请看以下示例:

<?php
$Date = strtotime('2011-02-22'); // February 22nd, 2011. 28 days in this month, 29 next year.
echo date('n/j/Y', strtotime('+1 year, +7 days', $Date)); // add 1 year and 7 days. prints 2/29/2012
echo "<br />";
echo date('n/j/Y', strtotime('+7 days, +1 year', $Date)); // add 7 days and 1 year, but this also prints 2/29/2012
echo "<br />";
echo date('n/j/Y', strtotime('+1 year', strtotime('+7 days', $Date))); // this prints 3/1/2012, what the 2nd would do if it was left-to-right
?>