PHP strtotime() 未返回正确的月份

发布于 2025-01-01 08:12:35 字数 167 浏览 0 评论 0原文

由于当前月份/年份是 2012 年 1 月,为什么以下代码返回 2011 年 12 月而不是 2011 年 11 月?

echo date("F Y", strtotime("-2 months"));

如果有影响的话,这是在 PHP 5.3.0 上。

Being that the current month/year is January 2012, why does the following code return December 2011 and not November 2011?

echo date("F Y", strtotime("-2 months"));

This is on PHP 5.3.0 if it makes a difference.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

小耗子 2025-01-08 08:12:35

要获得您正在寻找的内容,您可以使用这个相当冗长的版本:

echo date("F Y", strtotime("first day of this month - 2 months"));

此处详细描述了原始版本的问题:http://derickrethans.nl/obtaining-the-next-month-in-php.html。引述如下:

PHP 用户一遍又一遍地抱怨 PHP 的下个月
日期字符串解析器不会转到下个月,而是跳到
下个月之后的那个;就像下面的例子一样:

<前><代码>modify( '下个月' );
echo $d->format( 'F' ), "\n";
?>

这个小脚本的输出将是 March。三月显然没有
跟随一月,因为二月介于两者之间。然而,当前
行为是正确的。内部发生以下情况:

下个月将月份编号(最初为 1)加一。这
日期为 2010-02-31。第二个月(二月)只有28
2010 年的天数,因此 PHP 通过继续计数来自动更正此错误
从 2 月 1 日起的天数。然后你会在 3 月 3 日结束。格式化
去掉年份和日期,得到输出 March。这个可以
当使用完整的日期格式回显日期时很容易看到,
将输出 2010 年 3 月 3 日:

这是用于添加月份,但在减去月份时同样适用;没有 11 月 31 日,因此 strtotime 方法将其“更正”为 12 月 1 日。

To get what you are looking for you can use this rather verbose version instead:

echo date("F Y", strtotime("first day of this month - 2 months"));

The problem with your original version is described in detail here: http://derickrethans.nl/obtaining-the-next-month-in-php.html. Quoted below:

Over and over again PHP users complain that next month in PHP's
date-string parser doesn't go to the next month, but instead skips to
the one after next month; like in the following example:

<?php
$d = new DateTime( '2010-01-31' );
$d->modify( 'next month' );
echo $d->format( 'F' ), "\n";
?>

The output of the little script will be March. March obviously doesn't
follow January as February is in between. However, the current
behavior is correct. The following happens internally:

next month increases the month number (originally 1) by one. This
makes the date 2010-02-31. The second month (February) only has 28
days in 2010, so PHP auto-corrects this by just continuing to count
days from February 1st. You then end up at March 3rd. The formatting
strips off the year and day, resulting in the output March. This can
easily be seen when echoing the date with a full date format, which
will output March 3rd, 2010:

This is for adding months, but the same applies in reverse when subtracting months; there was no November 31st, so the strtotime method "corrects" it into December 1st.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文