我有一个简单的变量,它在今天增加了一个月:
$endOfCycle = date("Y-m", strtotime("+1 month"));
今天是 2013 年 1 月,所以我希望回到 2013-02,但我得到的是 2013-03。我不知道为什么它会跳到三月。
它跳到 3 月,因为今天是 1 月 29 日,加上一个月会得到 2 月 29 日,它不存在,所以它正在移动到下一个有效日期。
这也将发生在很多个月的 31 日,但在 1 月到 2 月的情况下显然更明显,因为 2 月更短。
如果您对月份中的某天不感兴趣,而只是希望它给出下个月,则应将输入日期指定为当前月份的第一天。如果您添加一个月,这将始终为您提供正确的答案。
出于同样的原因,如果你想总是得到下个月的最后一天,你应该从计算你想要的那一天之后的第一天开始,然后减去一天。
这应该是
$endOfCycle=date('Y-m-d', strtotime("+30 days"));
strtotime
期望得到一个包含美国英语日期格式的字符串,并将尝试将该格式解析为 Unix 时间戳(自 1970 年 1 月 1 日 00:00:00 UTC 以来的秒数),相对于现在给出的时间戳,或如果没有提供现在,则为当前时间。
尽管
date
返回根据给定格式字符串格式化的字符串,使用给定的整数时间戳或当前时间(如果没有给出时间戳)。
请参阅手册页:
今天是 1 月 29 日,+1 月表示 1 月 29 日,但由于今年 2 月包含 28 天,因此与次日 3 月 1 日重叠
而是尝试
strtotime('next month')
您可以使用此代码获取下个月:
$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
也许是因为它的 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')))));
$endOfCycle = date("Y-m", mktime(0, 0, 0, date("m", time())+1 , 15, date("m", time())));
试试这个:
$endOfCycle = date("Y-m", time()+2592000);
这增加了 30 天,而不是一个月的艰难。