2015-02-21 5 views
1

Я хотел бы получить интервал времени между двумя датами в часовом поясе, который использует летнее время.php интервал и часовой пояс

Следующий снайпер показывает проблему.

$timezone = new DateTimeZone('UTC'); 
$from_date_obj = DateTime::createFromFormat('Y-m-d H:i:s', '2014-10-31 23:59:59',$timezone); 
$to_date_obj = DateTime::createFromFormat('Y-m-d H:i:s', '2014-11-20 23:47:02',$timezone); 
$interval = $from_date_obj->diff($to_date_obj, TRUE); 
print_r($interval); 

Для UTC часового пояса это показывает:

DateInterval Object 
(
[y] => 0 
[m] => 0 
[d] => 19 
[h] => 23 
[i] => 47 
[s] => 3 
[weekday] => 0 
[weekday_behavior] => 0 
[first_last_day_of] => 0 
[invert] => 0 
[days] => 19 
[special_type] => 0 
[special_amount] => 0 
[have_weekday_relative] => 0 
[have_special_relative] => 0 
) 

Теперь это один:

$timezone = new DateTimeZone('America/Los_Angeles'); 
$from_date_obj = DateTime::createFromFormat('Y-m-d H:i:s', '2014-10-31 23:59:59',$timezone); 
$to_date_obj = DateTime::createFromFormat('Y-m-d H:i:s', '2014-11-20 23:47:02',$timezone); 
$interval = $from_date_obj->diff($to_date_obj, TRUE); 
print_r($interval); 

показывает:

DateInterval Object 
(
[y] => 0 
[m] => 0 
[d] => 20 
[h] => -1 
[i] => 47 
[s] => 3 
[weekday] => 0 
[weekday_behavior] => 0 
[first_last_day_of] => 0 
[invert] => 0 
[days] => 19 
[special_type] => 0 
[special_amount] => 0 
[have_weekday_relative] => 0 
[have_special_relative] => 0 
) 

один в UTC показывает 19 дней/23 часа/47 минут и 3 секунды. Один для PT показывает 20 дней/-1 часов/47 минут и 3 секунды. Я думаю, что правильный ответ для PT должен составлять 20 дней/0 часов/47 минут и 3 секунды.

Есть ли способ сделать разницу в тихоокеанском часовом поясе, а не в конечном итоге с отрицательным часом? Является ли показание -1 часов желаемым результатом и что именно оно означает?


обновление: я узнал, что на самом деле PHP, кажется, не обрабатывать различий в отношении летнего времени, который обсуждается здесь:

PHP's DateTime::Diff gets it wrong?

Что касается результатов, которые я получал его похоже, является ошибкой PHP, как указано в приведенной выше ссылке.

ответ

0

Какую версию php вы используете? Im получение этого результата для 2-го блока кода -

DateInterval Object ( 
[y] => 0 
[m] => 0 
[d] => 19 
[h] => 23 
[i] => 47 
[s] => 3 
[weekday] => 0 
[weekday_behavior] => 0 
[first_last_day_of] => 0 
[invert] => 0 
[days] => 19 
[special_type] => 0 
[special_amount] => 0 
[have_weekday_relative] => 0 
[have_special_relative] => 0 
) 

оба кодов должны отображать один и тот же результат, как ваши сравнения ту же дату только с другим часовым поясом каждый раз, когда

+0

hmmm ... версия 5.4.29 – macmiller

+0

Я получил 20 дней 0 часов от калькулятора продолжительности. Я думаю, что разница между двумя днями не то же самое, потому что в PT часы меняются на один час. например. разница между 2014-11-01 23:59 и 2014-11-02 23:59 Я думаю, что 1 день, 1 час, потому что часы меняются 1 час. – macmiller

+0

, но если они находятся в одном и том же часовом поясе, между ними нет 1 часа ... Возьмем, например, Нью-Йорк, один человек в Нью-Йорке имеет то же время, что и другой человек в Нью-Йорке, не так ли? поэтому, если они будут сравнивать времена между ними, они не потребуются для изменения часов. единственная проблема, которая может возникнуть между двумя датами, - это часть DST, и поэтому все ваши времена должны быть сохранены как UTC, а затем проще конвертировать даты – Gal

0

Есть две проблем, поднятых здесь: One имеет отношение к разнице между двумя датами и временем, когда происходит смена часов из-за DST (летнее время). В действительности разница между двумя датами и временем должна учитывать изменение часов, но, по-видимому, это не так.

Это документировано довольно хорошо в следующей ссылке:

PHP's DateTime::Diff gets it wrong?

Далее я известкование вверх -1 проблему как PHP ошибка. Поскольку PHP все равно не обрабатывает изменения DST между двумя датами, и в моем случае разница, не вступая в силу DST, в любом случае достаточно близка, я просто сделаю вычисление diff в UTC.

Смежные вопросы