PHP strtotime +1个月增加一个月

Jas*_*son 20 php date strtotime

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

$endOfCycle = date("Y-m", strtotime("+1 month"));
Run Code Online (Sandbox Code Playgroud)

今天是2013年1月,所以我希望能回到2013-02,但我现在得到了2013-03.我无法弄清楚为什么它会跳到三月.

SDC*_*SDC 21

因为今天是1月29日,所以它会跳到三月,并且在2月29日添加一个月,这是不存在的,所以它将进入下一个有效日期.

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

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

出于同样的原因,如果你想总是得到下个月的最后一天,你应该首先计算你想要的月份之后的第一天,然后减去一天.

  • 实际上,您应该使用当月15日作为基数(或任何其他日期不接近月末),然后重新调整到1日.这是一个痛苦,但考虑到使用一个月的第一个作为基数然后增加一个月,在某些情况下,将下一个月放在同一个月的第31个而不是下个月的第一个月.在月中使用基数,你永远不会得到意想不到的结果. (6认同)
  • 怎么样'日期('Ym-d',strtotime('下个月的最后一天'))`?这个对我有用... (6认同)
  • 没有开发人员在PHP的土地可以修复他们破碎的功能,我们不必诉诸任何方法.重点是取一个字符串并将其转换为时间戳,而不是将其转换为最佳估计值,可能是本月的下一个或最后一个.请求下一个,下一个,请求最后一个,获得最后一个等等.但这已经很多年了,并且我很快就看不到任何修复. (2认同)

One*_*rew 17

这应该是

$endOfCycle=date('Y-m-d', strtotime("+30 days"));
Run Code Online (Sandbox Code Playgroud)

strtotime

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

date

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

请参阅手册页:


Bla*_*nic 6

今天是 1 月 29 日,+1 个月表示 29 月 29 日,但由于今年 2 月有 28 天,因此它与第二天(即 3 月 1 日)重叠

相反尝试

strtotime('next month')
Run Code Online (Sandbox Code Playgroud)


Sal*_*n A 5

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

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

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

2013-02-01 00:00:00
2
Run Code Online (Sandbox Code Playgroud)