【问题标题】:Why does datetime->days always returns a positive number为什么 datetime->days 总是返回正数
【发布时间】:2018-07-28 00:35:57
【问题描述】:
// Difference from a date in the future:
$a = new DateTime('2000-01-01');
$b = new DateTime('2000-01-05');
$interval = $b->diff($a);
return $interval->days;             // Returns 4


// Difference from a date in the past:
$a = new DateTime('2000-01-01');
$b = new DateTime('1999-12-28');
$interval = $a->diff($b);           // Arguments swapped
return $interval->days;             // Returns 4

为什么这两个函数都返回正 4? 如果日期是过去的,如何返回负数?

【问题讨论】:

  • Diff 的返回值是一个DateInterval 对象。你是怎么输出的?
  • 对不起,我的代码有错别字,现在更新
  • DateInterval 对象具有指定它们是正数还是负数的 invert 属性:php.net/manual/de/class.dateinterval.php

标签: php datetime


【解决方案1】:

你可以使用DateInterval::format

return $interval->format("%r%a");

如果需要,转换为 int:

return (int)$interval->format("%r%a");

【讨论】:

  • 不清楚 $objA->diff($objB) == $objB - $objA。我将添加一个包含详细信息的新答案。
【解决方案2】:

如果日期是过去的,则反转将 1.
如果 Date 在未来,则 invert 将为 0。

$invert    = $interval->invert; 

【讨论】:

  • 这个答案不完整/令人困惑:If Date is in past ... which Date ?你比较两个约会伙伴;)
  • 回答问题(“为什么datetime->days总是返回一个正数?”):如果你期望一个负的返回值,这表示为$interval->invert = 1跨度>
【解决方案3】:

这是你的答案:

$today = new DateTime();
$date = new DateTime('2013-03-10');
$interval = $today->diff($date);
echo $interval->format("%r%a");

Test it here

【讨论】:

    【解决方案4】:

    当您比较两个 DateTime 对象时,以下规则适用:

    $objA->diff($objB) == $objB - $objA
    

    举个例子:

    $todayDateObj = new \DateTime('2016/5/26');
    $foundedDateObj = new \DateTime('1773/7/4');
    
    $interval = $todayDateObj->diff($foundedDateObj);
    echo $interval->format('%r%a') . "\n\n";
    // -88714
    
    $interval2 = $foundedDateObj->diff($todayDateObj);
    echo $interval2->format('%r%a');
    // 88714
    

    【讨论】:

      【解决方案5】:

      你可以像这样使用时间戳。

      <?php 
          $date1 = '2015-01-02';
          $date2 = '2015-01-05';
          $diff = strtotime($date1, 'Y-m-d') - strtotime($date2, 'Y-m-d'); 
      ?>
      

      $diff 将返回负数或正数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-23
        • 2021-01-24
        • 2014-11-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多