【问题标题】:PHP strtotime +1 month adding an extra month [duplicate]PHP strtotime +1 个月增加一个月 [重复]
【发布时间】:2023-01-27 20:24:16
【问题描述】:

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

$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】:

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

这也会发生在很多月份的 31 日,但在 1 月至 2 月的情况下显然更为明显,因为 2 月较短。

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

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

【讨论】:

  • 实际上,您应该以该月的 15 日为基准(或不接近月末的任何其他日期),然后重新调整为 1 日。这很痛苦,但请考虑使用一个月的第一天作为基数然后添加一个月,在某些情况下,下一个月将放在同月的 31 号而不是下个月的第一号。在月中使用基数,你永远不会得到意想不到的结果。
  • 如果 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】:

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

    $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
    

    【讨论】:

      【解决方案4】:

      今天是 1 月 29 日,+1 个月表示 2 月 29 日,但因为今年 2 月有 28 天,所以它与第二天即 3 月 1 日重叠

      而是尝试

      strtotime('next month')
      

      【讨论】:

        【解决方案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 天,而不是一个月的时间。

            【讨论】:

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