【问题标题】:PHP strtotime +1 month adding an extra month [duplicate]PHP strtotime +1个月增加了一个月[重复]
【发布时间】:2013-01-29 13:30:14
【问题描述】:

我有一个简单的变量,它将今天加一个月:

$endOfCycle = date("Y-m", strtotime("+1 month"));

今天是 2013 年 1 月,所以我希望回到 2013-02,但我得到的是 2013-03。我不知道为什么要跳到三月。

【问题讨论】:

  • see the Note in the Manual: 相对月份值是根据它们经过的月份长度计算的。一个例子是“+2 个月 2011-11-30”,它会产生“2012-01-30”。这是因为 11 月有 30 天,12 月有 31 天,总共有 61 天。

标签: php date strtotime


【解决方案1】:

它跳到 3 月,因为今天是 1 月 29 日,加上一个月会得到 2 月 29 日,它不存在,所以它移动到下一个有效日期。

这也将发生在很多个月的 31 日,但在 1 月到 2 月的情况下显然更明显,因为 2 月更短。

如果您对月份中的某天不感兴趣,而只是希望它给出下个月,则应将输入日期指定为当前月份的第一天。如果您添加一个月,这将始终为您提供正确的答案。

出于同样的原因,如果你想总是得到下个月的最后一天,你应该从计算你想要的后一个月的第一天开始,然后减去一天。

【讨论】:

  • 实际上,您应该以每月 15 日为基准(或任何其他不接近月底的日期),然后重新调整为 1 日。这很痛苦,但考虑到使用一个月的 1 号作为基数,然后添加一个月,在某些情况下,会将下一个月放在同月的 31 号,而不是下个月的 1 号。在月中使用基数,你永远不会得到意想不到的结果。
  • 如果 PHP 领域的开发人员无法修复他们损坏的功能,我们就不必求助于任何方法。重点是获取一个字符串并将其转换为时间戳,而不是将其转换为可能是下个月或上个月的最佳猜测。要求下一个,获得下一个,要求最后一个,获得最后一个等等。但这多年来一直很痛苦,我认为不会很快解决。
  • date('Y-m-d', strtotime('last day of next month')) 怎么样?它对我有用...
  • 我可以确认以上作品^下个月最后一天
  • 嘿@diegopso 老兄,谢谢,这是我需要的
【解决方案2】:

这应该是

$endOfCycle=date('Y-m-d', strtotime("+30 days"));

strtotime

期望得到一个包含美国英语日期格式的字符串,并将尝试将该格式解析为 Unix 时间戳(自 1970 年 1 月 1 日 00:00:00 UTC 以来的秒数),相对于现在给出的时间戳, 如果没有提供 now 则为当前时间。

同时

date

返回一个根据给定格式字符串格式化的字符串,使用给定的整数时间戳,如果没有给出时间戳,则返回当前时间。

请参阅手册页:

【讨论】:

    【解决方案3】:

    今天是 1 月 29 日,+1 月表示 2 月 29 日,但由于今年 2 月包含 28 天,因此与次日 3 月 1 日重叠

    不如试试

    strtotime('next month')
    

    【讨论】:

      【解决方案4】:

      您可以使用此代码获取下个月:

      $ts = mktime(0, 0, 0, date("n") + 1, 1);
      echo date("Y-m-d H:i:s", $ts);
      echo date("n", $ts);
      

      假设今天是2013-01-31 01:23:45以上将返回:

      2013-02-01 00:00:00
      2
      

      【讨论】:

        【解决方案5】:

        也许是因为它的 2013-01-29 所以 +1 个月是 2013-02-29 不存在所以它是 2013-03-01

        你可以试试

        date('m/d/y h:i a',(strtotime('next month',strtotime(date('m/01/y')))));
        

        来自http://php.net/manual/en/function.strtotime.php的cmets

        【讨论】:

          【解决方案6】:
           $endOfCycle = date("Y-m", mktime(0, 0, 0, date("m", time())+1 , 15, date("m", time())));
          

          【讨论】:

            【解决方案7】:

            试试这个:

            $endOfCycle = date("Y-m", time()+2592000);
            

            这增加了 30 天,而不是一个月。

            【讨论】:

            • 这仅适用于特定日期
            猜你喜欢
            • 2023-01-27
            • 1970-01-01
            • 1970-01-01
            • 2012-12-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多