【问题标题】:Issue with relative date formats in phpphp中相对日期格式的问题
【发布时间】:2015-04-03 23:26:20
【问题描述】:

考虑到某些月份的天数比其他月份少,我正在使用我发现的 here 函数将月份添加到日期中。

    function addMonths($date_str, $months){
        $date = new DateTime($date_str);
        $start_day = $date->format('j');
 var_dump($date->format('Y-m-d'));
        $date->modify("+{$months} month");
        $end_day = $date->format('j');
        var_dump($date->format('Y-m-d'));
        if ($start_day != $end_day)
            $date->modify('last day of last month');
        var_dump($date->format('Y-m-d'));die();
        return $date->format('Y-m-d');
    }

由于该函数未按预期工作,因此我转储了一些变量以查看发生了什么。让我们尝试以下方法:

addMonths('2012-05-31',1)

我得到以下错误输出:

string(10) "2012-05-31" string(10) "2012-07-01" string(10) "2012-05-31"

正如您所见,当我在输入日期中添加一个月时,我得到“2012-07-01”,但随后满足条件,我应该得到 6 月的最后一天,即 7 月的前一个月,而不是 5 月。我不知道发生了什么,你能帮帮我吗?

【问题讨论】:

  • 您使用哪个 php 版本?最后一个转储为我返回2012-06-30
  • 5.2.9,AFAIK修改方法适用于这个版本

标签: php datetime


【解决方案1】:

在 PHP 5.2.17 之前,PHP 有一个 bug with DateTime relative formats

试试这个:

<?php
function addMonths($date_str, $months) {
  $date      = new DateTime($date_str);
  $start_day = $date->format('j');

  $date->modify("+{$months} month");
  $end_day = $date->format('j');

  if ($start_day != $end_day) {
    $date->modify('last day');
  }

  return $date->format('Y-m-d');
}

echo addMonths('2012-05-31', 1);

我这里没有这么旧的PHP版本,但我认为它可以处理这个版本的last day

对我来说它返回:

2012-06-30

【讨论】:

  • 太好了,它也适用于我的版本,但是我将更新我的 php 版本,因为这不适用于闰年。谢谢
  • 当然没问题。是的,我强烈建议更新您的 PHP 版本!
  • 如果您阅读了错误报告,它实际上并不是错误。我不相信所有相对时间格式在 5.3 之前都有效。 php.net/manual/en/datetime.formats.relative.php
【解决方案2】:

我复制/粘贴了您的代码,以下是我在 PHP 5.3.3 上的输出:

string(10) "2012-05-31"
string(10) "2012-07-01"
string(10) "2012-06-30"

【讨论】:

  • 不知道是不是我的php版本,我用的是5.2.9
  • 这似乎是您的 PHP 版本中的一个错误。请参阅@DanLee 的回答。
【解决方案3】:
    function add_month($format , $date , $months_to_add ){
        return date($format, strtotime("$date +$months_to_add month"));
}

我正在使用这个。你可以试试这个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-26
    • 1970-01-01
    • 2011-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多