[英]Why does PHP date('m', strtotime('-1 months')) not work correctly for today? 07/31
我有一个脚本,可以在PHP中获取当前和上个月:
$currentMonth = date('m');
//Expected:07
//Result:07
$lastMonth = date('m', strtotime('-1 months'));
//Expected:06
//Result:07
今天恰好是7月31日或月底。 这个结果是从PHP预期的吗?
使用-31天时,结果如预期:
$lastMonth = date('m', strtotime('-31 days'));
//Expected:06
//Result:06
你可以这样做
$d = new DateTime();
$currentMonth = $d->format('m');
//Expected:07
//Result:07
print $currentMonth;
$d->modify('first day of previous month');
print "<br/>";
$lastMonth = $d->format('m');
//Expected:06
//Result:06
print $lastMonth;
这是PHP的日期字符串解析器的问题。 见这里: http : //derickrethans.nl/obtaining-the-next-month-in-php.html
@先生。 Llama制作了一个剧本,展示了这个问题影响的其他日期: http : //codepad.viper-7.com/E4gP0W
我采用的解决方案:
//Date:07/31/15
$currentMonth = date('m');
//Result:07
$lastMonth = date('m', strtotime('first day of -1 months'));
//Result:06
这是一个不会过期的更干净的测试用例 :
<?php
$origin = mktime(18, 0, 0, 7, 31, 2015);
var_dump( date('r', $origin), date('r', strtotime('-1 months', $origin)) );
string(31) "Fri, 31 Jul 2015 18:00:00 +0200"
string(31) "Wed, 01 Jul 2015 18:00:00 +0200"
我很确定这是一个文档问题,因为手册清楚地说明了这一点(强调我的):
相对月份值是根据它们经过的月份长度计算的 。 一个例子是“+ 2个月2011-11-30”,这将产生“2012-01-30”。 这是因为11月份为30天,12月为31天,共计61天。
......这是错的。
PHP bug跟踪器有很多关于此的欺骗 。 他们都被关闭,因为不是一个错误 。 以下是2009年的相关评论解释:
我同意这是一种烦人的行为。
而且,实施是有问题的。 基本上, 如果您使用'+1月',则需要月份数,添加1并将结果解析为新日期 。
如果您在该月的第一天使用“+1月”,则会将日期设置为该月的下一个月中。
这种行为给人的印象是,php考虑了一个月的长度,这不是真的。
但是,如果您在一个月的最后一天使用“+1月”,则结果出乎意料,因为2009-05-31变为2009-06-31,这是无效日期,然后被解释为2009-07-01。
这至少应该在文档中提到 。
-1 month
被解释为“上个月的同一天”。 如果这一天不存在,则日期会溢出到下个月。 实际上结果与strtotime("31.6.2015")
相同strtotime("31.6.2015")
- 试试吧!
月份有“s”过量。 它应该是这样的:
$lastMonth = date('m', strtotime('-1 month'));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.