繁体   English   中英

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

[英]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;

演示: http//codepad.viper-7.com/kokWi8

这是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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM