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

问题描述 投票:1回答:2

尝试创建过去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日)。

php date-formatting
2个回答
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

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>";
}
© www.soinside.com 2019 - 2024. All rights reserved.