Рассчитать часы между датами в разных часовых поясах

У меня есть массив дат (в разных часовых поясах по Гринвичу) и я хотел бы рассчитать часы, прошедшие между первой и последней датой.

Например, это будет массив дат:

[
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
]

Я хочу рассчитать часы, прошедшие с даты с индексами 1 до 2, от 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

Решение

Лучшее решение будет использовать DateTime классы.

Сначала вы создаете \DateTime объекты из строк даты:

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

Затем вы можете рассчитать разницу между двумя датами, используя diff() метод:

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

$diff это пример \DateTimeInterval, и вы можете отформатировать эту разницу, как вам нравится, например:

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

Другие решения

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 — это фиксированный момент времени (не относительное местное время).

Поскольку вы добавили теги для DateTime учебный класс:

$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
1

Вы должны использовать DateTime а также DateInterval классы. Они будут обрабатывать все время для вас.

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";
}
}
0
По вопросам рекламы [email protected]