获取两个日期之间的年份和月份

时间:2015-08-21 06:23:15

标签: php mysql date

我正在尝试这段代码:

$start_date = "2015-08-19";
$end_date = "2016-02-19";
$begin = new DateTime( $start_date );
$end = new DateTime( $end_date);
$interval = new DateInterval('P1Y'); // 1 Year interval

$period = new DatePeriod($begin, $interval, $end);
foreach ( $period as $dt ){
    echo $dt->format( "Y" );
}
$intervals = new DateInterval('P1M'); // 1 month interval

$periods = new DatePeriod($begin, $intervals, $end);
foreach ( $periods as $dts ){
    echo $dts->format( "m" );
}

我得到这样的输出:

year:2015
Month:08,09,...,01

在这个输出中,我没有得到年份:2016年和月份:02。我希望我的输出像这样:

year:2015,2016
Month:08,09,...,01,02

我怎么能得到这个?

如果我的结束日期是" 2016-08-20"

比获得年份:2016年但未获得月份:08

请注意,我的开始日期和结束日期不是固定的。

3 个答案:

答案 0 :(得分:1)

如前所述,不包括结束日期

您也可以像这样修改结束日期

$end = $end->modify( '+1 day +1 year' ); 

有关详细信息,请参阅php的日期时间modify

<强>更新

如果结束年份比开始日期大1年以上,那么添加一年的确会比我们想要的更多一年。

解决方案是仅在需要时检查并添加年份:

if($begin > (new DateTime( $end_date))->modify('-1 year')) {
    $end->modify( '+1 year' );  
}
$end->modify('+1 day');

答案 1 :(得分:1)

您可以使用以下代码来实现此目的:

<?php
$start    = (new DateTime('2015-12-02'))->modify('first day of this month');
$end      = (new DateTime('2016-05-06'))->modify('first day of this month');

//For Year
$interval = DateInterval::createFromDateString('1 year');
$period   = new DatePeriod($start, $interval, $end);
echo 'Year: ';

foreach ($period as $dt) 
{
    echo $dt->format("Y") . ",";
}

//For Month
$interval = DateInterval::createFromDateString('1 month');
$period   = new DatePeriod($start, $interval, $end);
echo '<br/>Month: ';

foreach ($period as $dt) 
{
    echo $dt->format("m") . ",";
}
?>
  

或者,您可以通过以下代码以Y-m格式很好地显示它:

$start    = (new DateTime('2015-12-02'))->modify('first day of this month');
$end      = (new DateTime('2016-05-06'))->modify('first day of this month');
$interval = DateInterval::createFromDateString('1 month');
$period   = new DatePeriod($start, $interval, $end);

foreach ($period as $dt) 
{
    echo $dt->format("Y-m") . "<br>\n";
}

答案 2 :(得分:0)

自2016年以来,02月未完成,您没有得到它。 试试这个

$start_date = "2015-08-19";
$end_date = "2016-02-19";
$begin = new DateTime( $start_date );
$end = new DateTime( $end_date);
$end->add(new DateInterval('P1Y1M'));
$interval = new DateInterval('P1Y'); // 1 Year interval

$period = new DatePeriod($begin, $interval, $end);
foreach ( $period as $dt ){
    echo $dt->format( "Y" );
}
$intervals = new DateInterval('P1M'); // 1 month interval

$periods = new DatePeriod($begin, $intervals, $end);
foreach ( $periods as $dts ){
    echo $dts->format( "m" );
}