【问题标题】:PHP DateInterval Jan - June and July - DecPHP DateInterval 一月 - 六月和七月 - 十二月
【发布时间】:2018-06-06 23:05:10
【问题描述】:

尝试创建过去 2 年的列表或日期间隔,分为 6 个月的范围,即 2015 年 1 月 - 2015 年 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


    【解决方案1】:

    添加一个间隔后,从中减去一天。使用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
    

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

    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”代表一月至六月,“2”代表七月至十二月。谢谢!
    【解决方案2】:

    您可以像这样为每个开始添加间隔大小“-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>";
    }
    

    【讨论】:

    • 不使用否定的add 与使用sub 相同吗?此外,sub 需要更直观、更简洁的原生方法。
    猜你喜欢
    • 1970-01-01
    • 2021-09-23
    • 1970-01-01
    • 2021-05-27
    • 2016-07-16
    • 1970-01-01
    • 2019-01-07
    • 1970-01-01
    • 2012-02-25
    相关资源
    最近更新 更多