PHP:奇怪的DateInterval长度计算 [英] PHP: Weird DateInterval length calculation

查看:61
本文介绍了PHP:奇怪的DateInterval长度计算的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在玩PHP时,我对此感到震惊:

While playing with PHP, I strucked on this :

<?php

$FebruaryTheFirst = \DateTime::createFromFormat('Y-m-d H:i:s', '2001-02-01 00:00:00');
$MarchTheSecond = \DateTime::createFromFormat('Y-m-d H:i:s', '2001-03-01 00:00:00');

$interval = $FebruaryTheFirst->diff($MarchTheSecond);

echo $interval->m.PHP_EOL; // Outputs 0. WTF?

$FebruaryTheFirstbis = \DateTime::createFromFormat('Y-m-d', '2001-02-01');
$MarchTheSecondbis = \DateTime::createFromFormat('Y-m-d', '2001-03-01');

$interval2 = $FebruaryTheFirstbis->diff($MarchTheSecondbis);

echo $interval2->m.PHP_EOL; // Outputs 1. WTF?

$FebruaryTheFirstter = \DateTime::createFromFormat('Y-m-d H:i:s', '2001-02-01 00:01:00');
$MarchTheSecondter = \DateTime::createFromFormat('Y-m-d H:i:s', '2001-03-02 00:01:00');

$interval3 = $FebruaryTheFirstter->diff($MarchTheSecondter);

echo $interval3->m.PHP_EOL; // Outputs 0. WTF?

$FebruaryTheFirstfour = \DateTime::createFromFormat('Y-m-d H:i:s', '2001-02-01 01:00:00');
$MarchTheSecondfour = \DateTime::createFromFormat('Y-m-d H:i:s', '2001-03-02 01:00:00');

$interval4 = $FebruaryTheFirstfour->diff($MarchTheSecondfour);

echo $interval4->m.PHP_EOL; // Outputs 1. WTF?



问题



我应该总是得到 1 作为输出,因为我一直在计算2月1日至3月1日之间的月份数。但如前所示,我还得到 0 => WTF?

Question

I should always get 1 as output, as I'm always counting the number of month between Februar, 1st and March, 1st. But as shown previously, I also get 0 => WTF?

有关信息,我的php版本是

For information my version of php is

PHP 5.3.8 (cli) (built: Jan 12 2012 19:12:32) Copyright (c) 1997-2011
The PHP Group Zend Engine v2.3.0, Copyright (c) 1998-2011 Zend
Technologies with Xdebug v2.1.1, Copyright (c) 2002-2011, by Derick Rethans


推荐答案

这似乎是PHP中的一个已知错误。查看错误报告。解决此问题的唯一方法(至少到目前为止)是在UTC中进行,以消除本地时区问题。

It looks like this is a known bug in PHP. Have a look at the bug report. The only way to fix this, at least for now, is to work in UTC to eliminate local timezone issues.

示例:

// Get the current timezone.
$originalTimezone = @date_default_timezone_get();

// Work in UTC.
date_default_timezone_set('UTC');

// ...
$dateStart = new DateTime('2001-02-01');
$dateEnd   = new DateTime('2001-03-01');
$interval = $dateStart->diff($dateEnd);

// Reset the timezone.
if ($originalTimezone) {
    date_default_timezone_set($originalTimezone);
}

这篇关于PHP:奇怪的DateInterval长度计算的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆