试图为过去两年建立一个清单或日期间隔,分为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日)。
发布于 2017-12-26 00:36:11
在加了一个间隔后,从其中减去一天。使用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发布于 2017-12-26 00:50:30
您只需为每个开始添加间隔大小'-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>";
}https://stackoverflow.com/questions/47972922
复制相似问题