0

ある期間 ("H:i" など) を格納する DateTime() オブジェクトの配列があります。この配列のすべての要素を合計して合計期間を取得するにはどうすればよいですか?

また、合計時間が 23 時 59 分よりも長い場合は、さらに多くの日数を取得できる必要があることも考慮に入れる必要があります。

これは可能ですか?

私はこのようにしようとしていました:

$duration = new DateTime('00:00');

foreach($routes as $route) {
   $arrival_time = new DateTime();
   $arrival_time->setTimestamp($route->arrival_time);

   $departure_time = new DateTime();
   $departure_time->setTimestamp($route->departure_time);

   $leg_duration = $arrival_time->diff($departure_time);
   $duration->add($leg_duration);
}

しかし、$duration私は時間を間違えました。

PS

使用する$duration->add($leg_duration);と、時間から減算され"24:00"ます。なぜですか? たとえば$leg_duration = new DateTime('02:10');、結果が"21:50".

$duration->sub($leg_duration);時間を追加する"24:00"

これは正しいですか?

4

2 に答える 2

1

質問の一部について:diff()メソッドを逆の方法で使用している場合、コードは実際には次のようになります。

$leg_duration = $departure_time->diff($arrival_time);

あなたのコードでは $departure_time - $arrival_time を計算しているためです (これは負であるため、この「反転した」結果が得られます)。

時間間隔の追加に関しては、DateTime オブジェクトにも日付が含まれているため、意味のある結果を得るには、次のような操作が必要になる場合があります。

$start = new DateTime('00:00');
$duration = $start;

// ...  your loop ...

$total = $start->diff($duration);

$totalDateInterval オブジェクトになり、そのフィールドには合計時間差が含まれている必要があります (ただし、これはテストしていません)。

于 2013-05-01T16:56:48.227 に答える
0
echo sum_the_time('01:45:22', '17:27:03');

これにより、結果が得られます。

19:12:2

function sum_the_time($time1, $time2) {
  $times = array($time1, $time2);
  $seconds = 0;
  foreach ($times as $time)
  {
    list($hour,$minute,$second) = explode(':', $time);
    $seconds += $hour*3600;
    $seconds += $minute*60;
    $seconds += $second;
  }
  $hours = floor($seconds/3600);
  $seconds -= $hours*3600;
  $minutes  = floor($seconds/60);
  $seconds -= $minutes*60;
  // return "{$hours}:{$minutes}:{$seconds}";
  return sprintf('%02d:%02d:%02d', $hours, $minutes, $seconds); // Thanks to Patrick
}

ここから見つけた

于 2016-09-09T01:42:53.530 に答える