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月更短.
如果您对月中的某一天不感兴趣而只是希望它在下个月提供,则应将输入日期指定为当月的第一个月.如果您添加一个月,这将始终为您提供正确的答案.
出于同样的原因,如果你想总是得到下个月的最后一天,你应该首先计算你想要的月份之后的第一天,然后减去一天.
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
使用给定的整数时间戳返回根据给定格式字符串格式化的字符串,如果没有给出时间戳,则返回当前时间.
请参阅手册页:
今天是 1 月 29 日,+1 个月表示 29 月 29 日,但由于今年 2 月有 28 天,因此它与第二天(即 3 月 1 日)重叠
相反尝试
strtotime('next month')
Run Code Online (Sandbox Code Playgroud)
您可以使用此代码获取下个月:
$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)