23

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

$endOfCycle = date("Y-m", strtotime("+1 month"));

今天是 2013 年 1 月,所以我希望回到 2013-02,但我得到的是 2013-03。我不知道为什么它会跳到三月。

4

7 回答 7

24

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

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

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

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

于 2013-01-29T13:37:38.950 回答
17

这应该是

$endOfCycle=date('Y-m-d', strtotime("+30 days"));

strtotime

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

尽管

date

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

请参阅手册页:

于 2013-01-29T13:34:08.733 回答
5

今天是 1 月 29 日,+1 月表示 1 月 29 日,但由于今年 2 月包含 28 天,因此与次日 3 月 1 日重叠

而是尝试

strtotime('next month')
于 2013-01-29T13:37:28.233 回答
5

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

$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-31T12:24:01.063 回答
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')))));

来自http://php.net/manual/en/function.strtotime.php的评论

于 2013-01-29T13:34:03.813 回答
-1
 $endOfCycle = date("Y-m", mktime(0, 0, 0, date("m", time())+1 , 15, date("m", time())));
于 2013-01-29T13:41:46.950 回答
-2

试试这个:

$endOfCycle = date("Y-m", time()+2592000);

这增加了 30 天,而不是一个月的艰难。

于 2013-01-29T13:33:13.970 回答