This question already has an answer here:
-
PHP: Adding months to a date, while not exceeding the last day of the month
4 answers
I have a simple variable that adds one month to today:
$endOfCycle = date("Y-m", strtotime("+1 month"));
Today is January 2013, so I would expect to get back 2013-02 but I'm getting 2013-03 instead. I can't figure out why it's jumping to March.
它跳跃到三月,因为今天是1月29日,并增加了每月给二月二十九日,这不存在,所以它移动到下一有效日期。
这将发生在很多个月的31日为好,但显然是在一月,二月到的情况下更noticable因为二月较短。
如果你不感兴趣月的一天,只是希望它给下个月,你应该指定输入日期为先的当月。 这将永远给你正确的答案,如果你加了一个月。
出于同样的原因,如果你想总是下个月的最后一天,你应该通过计算在第一个月你想要一前一后,并减去一天开始。
这应该是
$endOfCycle=date('Y-m-d', strtotime("+30 days"));
strtotime
期望成为一个包含美国英语日期格式的字符串,并会尝试解析格式为Unix时间戳(秒数自1970年1月1日00:00:00 UTC),相对于现在给出的时间戳,或如果现在不提供当前时间。
而
date
返回根据使用给定的整数时间戳或者如果没有时间戳给定的当前时间的给定的格式串格式化的字符串。
参见手册页:
- http://www.php.net/manual/en/function.strtotime.php
- http://www.php.net/manual/en/function.date.php
您可以使用此代码来获取下个月:
$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
今天是一月29日,1个月意味着Fabruary 29日,但由于日由今年28天,它有重叠的时候,第二天是3月1日
而是试图
strtotime('next month')
也许是因为它的2013年1月29日,以便1个月将是2013年2月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
$endOfCycle = date("Y-m", mktime(0, 0, 0, date("m", time())+1 , 15, date("m", time())));
试试这个:
$endOfCycle = date("Y-m", time()+2592000);
这增加了30天,不完全是一个艰难的一个月。