Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这是PHP中的一个bug吗';日期时间:不同?_Php_Datetime_Date_Time_Date Math - Fatal编程技术网

这是PHP中的一个bug吗';日期时间:不同?

这是PHP中的一个bug吗';日期时间:不同?,php,datetime,date,time,date-math,Php,Datetime,Date,Time,Date Math,i、 例如,2012年1月31日至2012年3月1日的收益率不到一个月!我希望输出为1个月1天。2月份的天数应该无关紧要;这就是使用时间库的意义所在--它应该处理这些事情 我应该向PHP提交一个bug吗?是否有一种破解/修复/解决方法可以让您如期工作数月?更新答案 DateTime::diff的这种行为当然出乎意料,但它不是一个bug。简而言之,diff返回年、月、日等,如果 >> $start_dt = new DateTime() DateTime::__set_state(ar

i、 例如,
2012年1月31日
2012年3月1日
的收益率不到一个月!我希望输出为1个月1天。2月份的天数应该无关紧要;这就是使用时间库的意义所在--它应该处理这些事情


我应该向PHP提交一个bug吗?是否有一种破解/修复/解决方法可以让您如期工作数月?

更新答案

DateTime::diff
的这种行为当然出乎意料,但它不是一个bug。简而言之,
diff
返回年、月、日等,如果

>> $start_dt = new DateTime()
DateTime::__set_state(array(
   'date' => '2012-04-11 08:34:01',
   'timezone_type' => 3,
   'timezone' => 'America/Los_Angeles',
))
>> $end_dt = new DateTime()
DateTime::__set_state(array(
   'date' => '2012-04-11 08:34:06',
   'timezone_type' => 3,
   'timezone' => 'America/Los_Angeles',
))
>> $start_dt->setTimestamp(strtotime('31-Jan-2012'))
DateTime::__set_state(array(
   'date' => '2012-01-31 00:00:00',
   'timezone_type' => 3,
   'timezone' => 'America/Los_Angeles',
))
>> $end_dt->setTimestamp(strtotime('1-Mar-2012'))
DateTime::__set_state(array(
   'date' => '2012-03-01 00:00:00',
   'timezone_type' => 3,
   'timezone' => 'America/Los_Angeles',
))
>> $interval = $start_dt->diff($end_dt)
DateInterval::__set_state(array(
   'y' => 0,
   'm' => 0,
   'd' => 30,
   'h' => 0,
   'i' => 0,
   's' => 0,
   'invert' => 0,
   'days' => 30,
))
>> $interval->format('%mm %dd')
'0m 30d'
您将返回对应于原始结束日期的时间戳

这些添加是“盲目”执行的,然后应用日期更正(例如,1月31日+1个月将是2月31日,根据年份更正为3月2日或3月3日)。在这个特定的示例中,您甚至不能添加一个月,Salath也解释了这一点

我应该向PHP提交一个bug吗

没有

间隔的“月”部分意味着开始日期的月部分可以增加那么多个月。PHP中的行为,以您的开始日期为
2012年1月31日
,递增月份(字面上是
2012年2月31日
),然后更正有效日期(PHP为您执行此操作),将给出
2012年3月02日
,该日期晚于您正在使用的目标日期

为了证明这一点,请选择开始日期,并在几个月内添加n个月,以查看行为

$end_ts = strtotime('+$y years +$m months +$d days' /* etc */, $start_ts);

您可以看到,月份正在递增,然后调整为有效日期。

12月1日显示间隔()中的
10
个月。我认为月份和年份没有固定的天数。如果你问它几个月,它应该计算两个日期之间的日历月数;多年来都是这样。这就是使用图书馆的好处;如果我想要一个“客观的”(读:一致的)天数,我只需要把我的两个时间戳除以。我明白你现在说的话了……这更合理。真倒霉我想我必须为我的问题想出一个不同的解决方案;也许我只需要把月数减去+1,因为这是正确的答案——我在过去遇到过这种行为,但由于不到恒星的文档没有发现这一点。谢谢你点亮了灯。:)
31-Jan-2012 (Interval)
02-Mar-2012 (P1M)
31-Mar-2012 (P2M)
01-May-2012 (P3M)
31-May-2012 (P4M)
01-Jul-2012 (P5M)