在PHP 5.1中添加月份的准确方法?

时间:2011-06-01 20:17:05

标签: php strtotime

昨天我遇到了PHP的strtotime问题没有正确添加一个月。在'2011-05-31'我跑了:

date('Y-m-d',strtotime( '+1 month', strtotime('now')));

当我期待'2011-06-30'时,返回'2011-07-01'。

MySQL没有任何问题。

我宁愿不用这个重新发明轮子,因为根据我的经验,通过日期计算很容易犯错误。

有没有人为PHP 5.1提供可靠且经过测试的解决方案?

7 个答案:

答案 0 :(得分:5)

在PHP中当然可以:检查strtotime manual, especially this comment

如果你有一个可用的MySQL连接,SELECT DATE_ADD( '2011-05-31', INTERVAL 1 MONTH )可以减少冗余,因为(正确的)功能已经实现,你不必自己实现它。

答案 1 :(得分:2)

由于这似乎是一个相当令人困惑的话题,因此这里有一些信息:

你实际上得到了一个准确的结果,它实际上将月份增加了1,当天仍然是31,因此日期是2011-06-31。如果您执行echo date('Y-m-d', strtotime('2011-06-31'));,则会看到它显示2011-07-01

这是在PHP 5.1(以及之前)

中使这项工作“预期”的一种方法
function next_month($timestamp)
{
    $next_month = date('m', $timestamp);
    $next_month++;

    $next_year = date('Y', $timestamp);

    if($next_month == 12)
    {
        $next_year++;
    }

    if(date('d', $timestamp) <= date('t', mktime(0, 0, 0, $next_month, 1, $next_year)))
    {
        return date('Y-m-d',strtotime( '+1 month', $timestamp));
    }
    else
    {
        return date('Y-m-d', mktime(0, 0, 0, $next_month, date('t', mktime(0, 0, 0, $next_month, 1, $next_year)), $next_year));
    }
}

echo next_month(strtotime('2011-05-31'));

echo next_month(strtotime('2011-05-01'));

这是我刚才写的库中的修改代码 - 我从来没有找到一个优雅的解决方案。

对于PHP 5.3 +

有关此主题的详细问答,请参阅PHP DateTime::modify adding and subtracting months

答案 2 :(得分:1)

你可能会说PHP正在做正确的事情,MySQL是错误的:

MySQL正在将值缩减回适合年/月定义的最后一个有效日期。 PHP向上调整,向前移动到与指定日期匹配的第一个正确日期(31-30 =过去1天,因此2011-06-30 + 1天= 2011-07-01)。

答案 3 :(得分:1)

添加+2592000 seconds 60×60×24×30 )对我来说是理想的方式。

答案 4 :(得分:1)

您可以将strtotime( 'last day of +1 month', strtotime('now'))的结果与strtotime( '+1 month', strtotime('now'))进行比较,并使用较早的结果。

答案 5 :(得分:1)

尝试使用:

$date = date_create("1900-01-01"); // Your start date
$new_date = date_add($date, date_interval_create_from_date_string('1 month')); // Your end date

答案 6 :(得分:0)

For other Months : date('Y-m-t',strtotime("2015-05-31T23:59:59 -3 days +1 month"));
Output           : 2015-06-30

For Feb          : date('Y-m-t',strtotime("2015-01-31T23:59:59 -3 days +1 month"));
Output           : 2015-02-28

这将解决您的问题。