【问题标题】:PHP strtotime() is not returning the correct monthPHP strtotime() 没有返回正确的月份
【发布时间】:2012-02-23 15:21:04
【问题描述】:

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

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

如果它有所作为,这是在 PHP 5.3.0 上。

【问题讨论】:

  • 可能是因为现在是 1 月 31 日。回到 2 个月前可能是 12 月 1 日
  • 服务器在哪个时区?有些地方现在是二月。
  • 刚刚在 PST 测试,12 月 1 日获得

标签: php


【解决方案1】:

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

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

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

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

<?php
$d = new DateTime( '2010-01-31' );
$d->modify( 'next month' );
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 日。

【讨论】:

  • 感谢您的链接。我肯定会争辩说这不是预期的行为,并且可以在第 31 天的几个月内偷偷摸摸。
  • 是的,我还认为这明显违反了最小意外原则。 en.wikipedia.org/wiki/Principle_of_least_surprise
  • 太棒了:D 谢谢你
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-21
  • 1970-01-01
  • 2012-04-15
  • 2017-07-29
  • 1970-01-01
  • 2017-04-09
  • 1970-01-01
相关资源
最近更新 更多