【问题标题】:Increment one month to date 2020-01-30 cancels the next month增加一个月至今 2020-01-30 取消下个月
【发布时间】:2019-11-23 11:55:20
【问题描述】:

给定日期是2019-12-30,我想为循环中的每次迭代添加 1 个月(所以 5 次)。

我写了这段代码:

$begin_date = '2019-12-30';
for ($i = 1; $i <= 5; $i++) {
    echo '<p>' . $begin_date . '</p>';

    $time = strtotime($begin_date);
    $begin_date = date("Y-m-d", strtotime("+1 month", $time));
}

我得到了以下结果

2019-12-30
2019-01-30
2019-03-01   invalid  --  I would expect 2019-02-28, at least last day
2019-04-01   invalid
2019-05-01   invalid

【问题讨论】:

    标签: php date increment leap-year


    【解决方案1】:

    您可以使用 DateTime 对象,然后将该对象修改为下个月的最后一天。如果一个月中的某一天大于 30,则减一(因为它永远不会高于 31)。

    $begin_date = '2019-12-30';
    $date = new DateTime($begin_date);
    for ($i = 1; $i <= 5; $i++) {
        echo '<p>'.$date->format("Y-m-d")."</p>\n";
        $date->modify("last day of next month");
        if ($date->format("d") > 30) {
            $date->modify("-1 day");
        }
    }
    

    如果您正在寻找一种更动态的方式(如果日期并不总是 30 日),您可以复制原始对象,并从当月的原始日期中减去当前日期。

    $begin_date = '2019-12-30';
    $date = new DateTime($begin_date);
    $original_date = clone $date;
    
    for ($i = 1; $i <= 5; $i++) {
        echo '<p>'.$date->format("Y-m-d")."</p>\n";
        $date->modify("last day of next month");
        if ($date->format("d") > $original_date->format("d")) {
            $date->modify("-".($date->format("d") - $original_date->format("d"))." day");
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-10-21
      • 2011-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-27
      • 1970-01-01
      相关资源
      最近更新 更多