为什么diff返回不正确的值?

时间:2013-07-30 09:40:00

标签: php datetime diff

Diff返回的值不正确,不正确意味着它不是预期的值。我需要它返回总分钟,例如1小时7分钟需要67分钟。

<?php
// Trouble-shoot why time is being calculate incorrectly at 7 minutes when
// it should be 67 minutes for total travel time.

date_default_timezone_set('America/New_York');
// Display the total travel time in minutes for a trip.

    $depart = "10:31:00 07/30/2013";
    $arrival = "7/30/2013 11:38:00 AM";

    echo "depart time is: " . $depart . "\n";
    echo "arrival time is: " . $arrival . "\n";
    $depart_raw = DateTime::createFromFormat("H:i:s m/d/Y", $depart);
    $arrival_raw = DateTime::createFromFormat("m/d/Y g:i:s a", $arrival);
    var_dump($depart_raw);
    var_dump($arrival_raw);
    $interval = $depart_raw->diff($arrival_raw);
    var_dump($interval);
    echo "Total travel time is: " . $interval->format("%i")." minutes" . "\n";

?>

输出:

depart time is: 10:31:00 07/30/2013
arrival time is: 7/30/2013 11:38:00 AM
object(DateTime)#1 (3) {
  ["date"]=>
  string(19) "2013-07-30 10:31:00"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(16) "America/New_York"
}
object(DateTime)#2 (3) {
  ["date"]=>
  string(19) "2013-07-30 11:38:00"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(16) "America/New_York"
}
object(DateInterval)#3 (8) {
  ["y"]=>
  int(0)
  ["m"]=>
  int(0)
  ["d"]=>
  int(0)
  ["h"]=>
  int(1)
  ["i"]=>
  int(7)
  ["s"]=>
  int(0)
  ["invert"]=>
  int(0)
  ["days"]=>
  int(0)
}
Total travel time is: 7 minutes

3 个答案:

答案 0 :(得分:4)

您将获得正确的间隔,但是,您只显示其中的“分钟”部分,而不是小时。 var_dump($interval)看看我的意思 - 总间隔是1小时7分钟。

你的错误是假设%i格式会给你67分钟 - 它不会。你可以用这样的东西来计算它:

$minutes= 
   $interval->format("%a")*24*60 + //total days
   $interval->format("%H")*60 +    //hours
   $interval->format("%i");        //minutes

请参阅http://www.php.net/manual/en/dateinterval.format.php

答案 1 :(得分:1)

这将输出您期望的结果

$traveltime = 60 * $interval->format("%H") + $interval->format("%i");
echo "Total travel time is: " . $traveltime . " minutes" . "\n";`

答案 2 :(得分:0)

 echo "Total travel time is: " .$interval->format("%h") ." hours and " . $interval->format("%i")." minutes" . "\n";

你只是显示分钟而不是小时。它将分钟转换为小时,并将它们存储在数组的不同部分。

  ["h"]=>
  int(1)

  ["i"]=>
  int(7)

在这种情况下,只需:

 echo "Total travel time is: " . ($interval->format("%i")+($interval->format("%h")*60))." minutes" . "\n";