计算目标日期之前的最后一天的日期

时间:2017-03-05 20:59:14

标签: php date strtotime

我可以添加任意数月的日期:

strtotime("+ 1 months", '2017-01-31') // result: 2017-03-03

但是我想在不进入下个月的情况下这样做。

在这种情况下,我想要结果2017-02-28,即目标月之前的月的最后一天。

4 个答案:

答案 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