php - 增加一个月至今 2020-01-30 取消下个月
问题描述
给定日期是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
解决方案
您可以使用 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");
}
}
推荐阅读
- excel-formula - 索引和匹配多个结果并连接
- kubernetes - 从 Kubernetes 中删除 configmap 本身
- c# - 从 XML 文件导入到 MS Project 后,什么会导致设置不正确的日期?
- python - 我可以使用 selenium+python 获得多选选项吗
- python - [Tensorflow 1.x] 使用 BERT 的多标签分类,无效参数:断言失败:[`predictions` 包含负值]
- css - CSS动画随着旋转来回移动
- ios - 有人可以帮我解决这个警告:冗余一致性约束'T':'ReusableView'吗?我到处搜索,但没有发现任何帮助
- c# - 使用自定义 API 进行外部登录
- postcss - 嵌套的 @import CSS 语句未使用 rollup-plugin-postcss 进行汇总
- c# - 如何使用多个条件(可能为空)从数据库中优雅地选择行?