尝试创建过去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日)。
答案 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>";
}