PHP DateInterval 1月 - 6月和7月 - 12月

时间:2017-12-26 00:27:03

标签: php date-formatting

尝试创建过去2年的列表或日期间隔,分为6个月的范围,即2015年1月至6月,2015年7月至12月,2016年1月至6月......直到今天。

我已经研究过DateTime和DateInterval,就像这样

$begin = new DateTime( '2015-01-01' );
$end = new DateTime( '2017-12-26' );

$interval = new DateInterval('P6M');

$period = new DatePeriod($begin, $interval, $end);

foreach ( $period as $dt )
    echo sprintf("%s\n", $dt->format("Y-m-d"));

哪个给了我

2015-01-01
2015-07-01
2016-01-01
2016-07-01
2017-01-01
2017-07-01

无法弄清楚如何获得每个时期的开始和结束(1月1日 - 6月30日和7月1日 - 12月31日)。

2 个答案:

答案 0 :(得分:3)

添加间隔后,从中减去一天。使用sub()new DateInterval('P1D'),表示减去一天。

foreach ( $period as $dt )
    echo sprintf(
        "%s %s\n",
        $dt->format("Y-m-d"),
        $dt->add($interval)
            ->sub(new DateInterval('P1D'))
            ->format("Y-m-d"));

输出:

2015-01-01 2015-06-30
2015-07-01 2015-12-31
2016-01-01 2016-06-30
2016-07-01 2016-12-31
2017-01-01 2017-06-30
2017-07-01 2017-12-31

更新:在评论中,您还询问了如何指出日期所代表的一半。答案太明显了:

sprintf(
    "%s %s %d\n",
    $dt->format("Y-m-d"),
    $dt->add($interval)
        ->sub(new DateInterval('P1D'))
        ->format("Y-m-d"),
    $dt->format("n")/6
);

注意%d和相应的$dt->format("n")/6

为我输出:

2015-01-01 2015-06-30 1
2015-07-01 2015-12-31 2
2016-01-01 2016-06-30 1
2016-07-01 2016-12-31 2
2017-01-01 2017-06-30 1
2017-07-01 2017-12-31 2

答案 1 :(得分:0)

你可以添加区间大小' -1'每个开头都是这样的:

$begin = new DateTime( '2015-01-01' );
$end = new DateTime( '2017-12-26' );

$interval = new DateInterval('P6M');

$period = new DatePeriod($begin, $interval, $end);

$oneDay = new DateInterval("P1D");
$oneDay->invert=1; #just get the previous day as if("P-1D")
foreach ( $period as $dt ){
    echo  $dt->format("Y-m-d"); #interval start
    $dt->add($interval); #adding the interval size
    $dt->add($oneDay);   #get the last day of the cur interval
    echo "<br>";
    echo $dt->format("Y-m-d");  #interval end
    echo "<br>";
}