2016-06-01 4 views
0

私は日付の配列(異なるタイムゾーンGMT)であり、最初と最後の日付の間に経過した時間を計算したいと思います。異なるタイムゾーンの日付間の時間を計算します

例えば、これは、日付の配列のようになります。

[ 
    1 => 2016-06-05T08:45:00.000+02:00, 
    2 => 2016-06-05T09:55:00.000+02:00, 
    3 => 2016-06-05T12:10:00.000+02:00, 
    4 => 2016-06-05T14:25:00.000-04:00 
] 

私は2に、インデックス1と日付から経過した時間を計算したい、2〜3及び3から4へ問題は、正しい結果を得るために時間を追加または減算する必要がある場合、タイムゾーンに従って計算する方法を知らないことです。

私は、コードを開発するために計算される方法を知っておく必要があります。

$tIda = 0; 

foreach ($times0 as $i => $time) 
{ 
    if ($i < sizeof($times0) - 1) 
    { 
     $datetime1 = strtotime(substr($time, 0, 10) . ' ' . substr($time, 11, 8)); 
     $datetime2 = strtotime(substr($times0[$i + 1], 0, 10) . ' ' . substr($times0[$i + 1], 11, 8)); 
     $interval = abs($datetime2 - $datetime1); 
     $tIda += round($interval/60); 
    } 
} 

ありがとう:それは(タイムゾーンに従って計算の欠如のための)ものになるだろう。

+0

試したことがありますか? – Naruto

+0

@Narutoコードをどのように計算するかを知る必要があります。とにかく投稿を編集しました。 – JSGarcia

答えて

2

ベストソリューションは、DateTimeクラスを使用することです。

まず、あなたは、日付文字列から\DateTimeオブジェクトの作成:

$diff = $datetime1->diff($datetime2); 

$diff\DateTimeIntervalのインスタンスであり、そしてあなた:

$datetime1 = new \DateTime($time); 
$datetime2 = new \DateTime($times0[$i + 1]); 

を次に、あなたはdiff()メソッドを使用して、2つの日付の差を計算することができますこのような違いは、好きなようにフォーマットできます。たとえば、

$diff->format('%H:%I:%S') 
+0

2番目の引数はオプションで、最初のコンストラクタ引数に "2016-06-05T14:25:00.000-04:00"のようなものを渡すと、タイムゾーンが文字列から正しく解決されます。私が知っている、私は私の答えを投稿する前にチェックした;)PHPのバージョン5.6.18 –

1

strtotime()うまくタイムゾーンを解析します

$a = '2016-06-05T12:10:00.000+02:00'; 
$b = '2016-06-05T14:25:00.000-04:00'; 

$ts_a = strtotime($a); 
$ts_b = strtotime($b); 
var_dump($a, date('r', $ts_a), $b, date('r', $ts_b)); 
string(29) "2016-06-05T12:10:00.000+02:00" 
string(31) "Sun, 05 Jun 2016 12:10:00 +0200" 
string(29) "2016-06-05T14:25:00.000-04:00" 
string(31) "Sun, 05 Jun 2016 20:25:00 +0200" 

を...そしてあなたがUnixタイムスタンプを持っていたら、Unixタイムスタンプは、時間内に一定の瞬間(ではない相対的であるので、あなたがタイムゾーンを忘れることができます現地時間)。

$a = '2016-06-05T12:10:00.000+02:00'; 
$b = '2016-06-05T14:25:00.000-04:00'; 

$dt_a = new DateTime($a); 
$dt_b = new DateTime($b); 
var_dump($dt_a->diff($dt_b)->format('%h')); // Prints: 8 
0

あなたがDateTimeDateIntervalクラスを使用する必要があります:あなたはDateTimeクラスのタグを追加したので

。彼らはあなたのためにすべてのタイムズームの騒ぎを処理します。

foreach ($times as $i => $time) { 
    if ($i > 0) { // not on the 1st element 
     $datetime1 = new DateTime($times[$i-1]); 
     $datetime2 = new DateTime($times[$i]); 
     $interval = $datetime1->diff($datetime2); 
     $interval_hours = ($interval->invert ? -1 : 1) * ($interval->days *24 + $interval->h); 
     // days are the total days, h are the hours in day 
     // invert is negative, if $datetime2 is before $datetime1 
     echo "Diff from ".$times[$i-1]." to ".$times[$i].": ".$interval_hours."\n"; 
    } 
} 
関連する問題