【问题标题】:PHP Date differencePHP日期差异
【发布时间】:2013-06-14 12:22:32
【问题描述】:

我有以下代码:

$dStart = new DateTime('2013-03-15');
$dEnd = new DateTime('2013-04-01');
$dDiff = $dStart->diff($dEnd);
echo $dDiff->days;

我不知道为什么我得到 6015 结果。

【问题讨论】:

  • 如果将日期偏移一会发生什么?例如,试试2013-03-162013-04-02
  • 如果我设置 2013-03-16 和 2013-04-02 我得到相同的值 6015
  • 我发现了 Bug#51184 bugs.php.net/bug.php?id=51184的报告
  • 显然您现在不能,但您应该尽快将其作为答案并将其标记为正确答案。

标签: php date diff


【解决方案1】:

试试看

$dStart = strtotime('2013-03-15');
$dEnd = strtotime('2013-04-01');
$dDiff = $dEnd - $dStart;
echo date('H:i:s',$dDiff);

或根据您的代码尝试

$dDiff = $dStart->diff($dEnd);
$date->format('d',$dDiff);
echo $dDiff->days;

如果你想在几天内获得差异,也可以试试这个

echo floor($dDiff/(60*60*24));

【讨论】:

  • 返回“01:01:00”我希望得到两个日期之间的天数差异
  • @GautamD3164 请参阅下面对 Haralan Dobrev 回答的评论。可能值得为未来的读者编辑答案
  • 嘿,你能告诉我关闭它的原因吗?
【解决方案2】:

试试这个-

$dStart = new DateTime('2013-03-15');
$dEnd = new DateTime('2013-04-01');
$dDiff = $dStart->diff($dEnd);
echo $dDiff->format('%d days')

查看PHP

请查看demo link

【讨论】:

  • 返回+6015天也必须是PHP版本的bug
  • @carlosduarte:更新帖子并添加 phpfiddle 链接:phpfiddle.org/main/code/7dq-mb7
  • 在此示例中,您添加任何日期...假设将其更改为 2015 它总是返回 17 天
【解决方案3】:

使用这个

 $datetime1 = date_create('2013-03-15');
 $datetime2 = date_create('2013-04-01');
 $interval = date_diff($datetime1, $datetime2);
 echo $interval->format('%R%a days');

【讨论】:

  • 它返回+6015天可能是一个php错误? PHP 版本 5.3.1
  • 可能是您的 php 版本返回错误。我已经测试过,它返回 +17 天。
  • 我无法理解 PHP 发生了什么,如果我回显 (1363305600 - 1364857200 ) / ( 60 * 60 * 24 ) 它返回 -A.9583333333333
  • 您能告诉我您使用的是哪个版本的 PHP 吗?因为它在我的本地版本中返回正确的值,即 -17.958333333333 应该是。
  • @TapasPal:请详细说明“我的本地版本”。什么版本?对我来说,它在 PHP 5.3.0 上仍然给出“+6015 天”。检查我的解决方案是如何通过的。
【解决方案4】:

我更喜欢这样的:

function days_diff($first_date, $second_date)
{
    $later = new DateTime($second_date);
    $then = new DateTime($first_date);
    return $later->diff($then)->format('a');
}

【讨论】:

  • 是的,这是唯一适用于 PHP 5.3.1 的解决方案
  • 如果差值超过 1 个月,这将不起作用。 DateInterval 将翻转并递增 m,将 d 重置回 0。目前,您必须使用 $interval->format('a') 来获取两天之间的总天数(如果您预计该范围曾经1个月以上)
  • @ColinMorelli 谢谢!我已经应用了编辑。我使用这个功能没有问题,但我的情况总是在一个月内。
【解决方案5】:

我在 PHP 5.3.0 上获得了相同的 6015 天,并使用 var_dump() 找到了解决方案。 我的确切代码在这里:

$timestring = "Thu, 13 Jun 2013 14:05:59 GMT";
date_default_timezone_set('GMT');
$date = DateTime::createFromFormat('D, d M Y G:i:s T', $timeString);
$nowdate = new DateTime("now");
$interval = $date->diff($nowdate);

现在如果我做一个var_dump($interval),结果是:

object(DateInterval)#5 (8) {
  ["y"]=>
  int(0)
  ["m"]=>
  int(0)
  ["d"]=>
  int(0)
  ["h"]=>
  int(19)
  ["i"]=>
  int(45)
  ["s"]=>
  int(33)
  ["invert"]=>
  int(0)
  ["days"]=>
  int(6015)
}

所以小时 (h)、分钟 (i) 和秒 (s) 设置正确,但还有另一个属性 days 保持在 6015 不变,这就是其他人得到的漏洞。好吧,我不明白它从哪里得到这个值。同样,根据http://www.php.net/manual/en/class.dateinterval.phpDateInterval 的PHP 手册,我尝试将它们作为对象的属性进行访问,一切顺利。

因此,我得到了准确的结果:

echo (string) $interval->d." days ago";

【讨论】:

    猜你喜欢
    • 2011-04-21
    • 1970-01-01
    • 2010-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-17
    • 1970-01-01
    相关资源
    最近更新 更多