为什么PHP日期('m',strtotime(' - 1个月'))今天无法正常工作?07/31

Sub*_*bie 6 php date strtotime

我有一个脚本,可以在PHP中获取当前和上个月:

$currentMonth = date('m');
//Expected:07
//Result:07
$lastMonth = date('m', strtotime('-1 months'));
//Expected:06
//Result:07
Run Code Online (Sandbox Code Playgroud)

今天恰好是7月31日或月底.这个结果是从PHP预期的吗?

使用-31天时,结果如预期:

$lastMonth = date('m', strtotime('-31 days'));
//Expected:06
//Result:06
Run Code Online (Sandbox Code Playgroud)

Álv*_*lez 2

这是一个不会过期的更干净的测试用例:

<?php
$origin = mktime(18, 0, 0, 7, 31, 2015);
var_dump( date('r', $origin), date('r', strtotime('-1 months', $origin)) );
Run Code Online (Sandbox Code Playgroud)
string(31) "Fri, 31 Jul 2015 18:00:00 +0200" 
string(31) "Wed, 01 Jul 2015 18:00:00 +0200"
Run Code Online (Sandbox Code Playgroud)

我很确定这是一个文档问题,因为手册清楚地说明了这一点(强调我的):

相对月份值是根据月份的长度计算的 。例如,“+2 月 2011-11-30”将生成“2012-01-30”。这是因为 11 月有 30 天,12 月有 31 天,总共 61 天。

...这是错误的。

PHP bug tracker 有大量关于此的欺骗。它们都被关闭了,不是一个错误以下是2009 年的相关评论对此进行了解释:

我同意这是一种令人讨厌的行为。

另外,执行上也存在问题。基本上,如果您使用“+1 个月”,它将获取月份编号,加 1 并将结果解析为新日期

如果您在该月的第一天使用“+1 个月”,则会将日期设置为该月的下一个第一天。

这种行为给人的印象是 php 考虑一个月的长度,但事实并非如此。

但是,如果您在一个月的最后一天使用“+1 个月”,则结果会出乎意料,因为 2009-05-31 会变成 2009-06-31,这是一个无效日期,然后会解释为 2009-07-01。

至少应该在文档中提及