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)
这是一个不会过期的更干净的测试用例:
<?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。
这至少应该在文档中提及。