首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP DateInterval 1月至6月和7月至12月

PHP DateInterval 1月至6月和7月至12月
EN

Stack Overflow用户
提问于 2017-12-26 00:27:02
回答 2查看 244关注 0票数 1

试图为过去两年建立一个清单或日期间隔,分为6个月,即2015年1月至6月、2015年7月至12月、2016年1月至6月.直到今天。

我研究过DateTime和DateInterval,类似这样的东西

代码语言:javascript
复制
$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"));

这给了我

代码语言:javascript
复制
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日)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-12-26 00:36:11

在加了一个间隔后,从其中减去一天。使用sub()new DateInterval('P1D'),表示一天的减法。

代码语言:javascript
复制
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"));

这一产出如下:

代码语言:javascript
复制
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

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

代码语言:javascript
复制
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

我的产出:

代码语言:javascript
复制
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
票数 3
EN

Stack Overflow用户

发布于 2017-12-26 00:50:30

您只需为每个开始添加间隔大小'-1‘,如下所示:

代码语言:javascript
复制
$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>";
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47972922

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档