【问题标题】:Accurate method to add months in PHP 5.1?在 PHP 5.1 中添加月份的准确方法?
【发布时间】:2018-05-16 19:34:24
【问题描述】:

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

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

当我期待“2011-06-30”时返回“2011-07-01”。

MySQL 这样做没有任何问题。

我不想重新发明轮子,因为根据我的经验,日期计算很容易出错。

对于 PHP 5.1,是否有人为此提供可靠且经过测试的解决方案?

【问题讨论】:

  • 您是否设置了正确的语言环境?
  • 如果你想在 PHP 中获得更好的覆盖率,php.net/datetime 类将是值得冒险的事情。
  • 这个问题接受的答案看起来应该可以解决您的问题:stackoverflow.com/questions/5760262/…
  • 这是 100% 正确的,它增加了 1 个月,但 6 月只有 30 天,因此第 31 天是 8 月 1 日。简要回答我不久前提出的问题:stackoverflow.com/questions/3602405/…
  • DateTime 对象是 PHP 5.2,我特地要求一个 PHP 5.1 的解决方案。我的语言环境设置为正确的时区。

标签: php strtotime


【解决方案1】:

这在 PHP 中当然是可能的:检查strtotime manual, especially this comment

如果您有可用的 MySQL 连接,SELECT DATE_ADD( '2011-05-31', INTERVAL 1 MONTH ) 的冗余会更少,因为(正确的)功能已经实现,而无需您自己实现。

【讨论】:

  • 谢谢,我从来不知道它是可用的。很高兴我关注了这个问题
【解决方案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,了解有关此主题的详细问答。

【讨论】:

    【解决方案3】:

    你可能会争辩说 PHP 做的是正确的事,而 MySQL 是错误的:

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

    【讨论】:

    • 如果我必须选择 MySQl、Sql Server、Javascript 等与 PHP 的一方谁是正确的,我不会在这种情况下选择 PHP。
    【解决方案4】:

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

    【讨论】:

    • 二月呢? 1 月 31 日 + 30 天让您进入 3 月,完全跳过 2 月。
    • 这也有类似的问题,但是增加了 30 天而不是 31
    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

      尝试使用:

      $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
      

      【讨论】:

        【解决方案7】:
        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
        

        这将解决您的问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-03-21
          • 1970-01-01
          • 1970-01-01
          • 2015-04-01
          • 2015-03-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多