我可以添加任意数月的日期:
strtotime("+ 1 months", '2017-01-31') // result: 2017-03-03
但是我想在不进入下个月的情况下这样做。
在这种情况下,我想要结果2017-02-28,即目标月之前的月的最后一天。
答案 0 :(得分:1)
这些答案似乎有很多过于复杂的问题。您希望在目标月份之前的月份的最后一天,也就是在目标月份的第一天之前的1天。这可以很简单地表达出来:
$months = 1;
$relativeto = '2017-01-31';
echo date(
'Y-m-d',
strtotime(
'-1 day',
strtotime(
date(
'Y-m-01',
strtotime("+ $months months", strtotime($relativeto))
)
)
)
);
答案 1 :(得分:0)
使用PHP DateTime来完成此操作,特别是modify()方法。
$date = new DateTime('2006-12-12');
$date->modify('+1 month');
echo $date->format('Y-m-d');
答案 2 :(得分:0)
尝试使用DateTime对象,如下所示:
$dateTime = new \DateTime('2017-01-31');
$dateTime->add(new \DateInterval('P1M'));
$result = $dateTime->format('Y-m-d');
答案 3 :(得分:0)
如果这里的想法是不允许日期溢出到下个月,PHP会这样做,那么你必须在你的逻辑中强加那个约束。
一种方法是在返回更新日期之前检查修改后的月份与给定月份。
function nextMonth(DateTimeImmutable $date) {
$nextMonth = $date->add(new DateInterval("P1M"));
$diff = $nextMonth->diff($date);
if ($diff->d > 0) {
$nextMonth = $nextMonth->sub(new DateInterval("P{$diff->d}D"));
}
return $nextMonth;
}
$date = new DateTimeImmutable("2017-01-31");
$nextMonth = nextMonth($date);
echo "{$date->format('Y-m-d')} - {$nextMonth->format('Y-m-d')}\n";
//2017-01-31 - 2017-02-28
$date = new DateTimeImmutable("2017-10-31");
$nextMonth = nextMonth($date);
echo "{$date->format('Y-m-d')} - {$nextMonth->format('Y-m-d')}\n";
//2017-10-31 - 2017-11-30
上例中的nextMonth()
函数强加了不会溢出到下个月的约束。请注意,PHP实际执行的操作是尝试查找相应的日期,在以下连续的月份中添加,而不是仅将现有日期添加给定的月份。我只是通过减去上述函数中1个月间隔之外的任何额外天数来撤消最后一部分。
例如,对于日期strtotime("+1 month")
,"2017-01-31"
告诉PHP找到距"2017-01-31"
+1个月的第31天。但是,当然,2月只有28天,因此PHP进入3月份,并且需要再花3天才能弥补。
换句话说,这个日期不仅添加+1个月,而且在此日期添加+1个月 和 到达当月的同一天。这就是溢出发生的地方。
由于您现在已经明确表示您实际上想要该月的最后一天(不一定是下个月的同一天没有溢出条款),您应该明确地设置月份的日期。
function nextMonth(DateTimeImmutable $date) {
$nextMonth = $date->setDate($date->format('Y'), $date->format('n') + 1, 1);
$nextMonth = $date->setDate($nextMonth->format('Y'), $nextMonth->format('n'), $nextMonth->format('t'));
return $nextMonth;
}
$date = new DateTimeImmutable("2017-02-28");
$nextMonth = nextMonth($date);
echo "{$date->format('Y-m-d')} - {$nextMonth->format('Y-m-d')}\n";
// 2017-02-28 - 2017-03-31