datetime — интервал между датами, включая часы переполнения стека

Я хочу найти интервал между датами, функция часа не работает правильно за час до изменения времени. Я знаю, что есть ответ, который частично отвечает на этот вопрос Вот. Но это не отвечает на это по часам.

У меня есть следующий код PHP:

//helper function to pluralize words
function pluralize( $count, $text ){
return $count . ( ( $count == 1 ) ? ( " $text" ) : ( " ${text}s" ) );
}

/**
* Difference of dates
* @param type $date1 DateTime first date
* @param type $date2 DateTime second date
* @return type string year, month, day, hour, minute, second
*/
function timeDiff($date1, $date2 ){
$string = "";
$interval =$date1->diff($date2);
$suffix = ( $interval->invert ? ' ago' : '' );
if ( $v = $interval->y >= 1 ) $string .= pluralize( $interval->y, 'year' ). ', ';
if ( $v = $interval->m >= 1 ) $string .= pluralize( $interval->m, 'month' ). ', ';
if ( $v = $interval->d >= 1 ) $string .= pluralize( $interval->d, 'day' ). ', ';
if ( $v = $interval->h >= 1 ) $string .= pluralize( ($interval->h), 'hour' ) . ', ';
if ( $v = $interval->i >= 1 ) $string .= pluralize( $interval->i, 'minute' ). ', ';
if ( $v = $interval->i >= 1 ) $string .= pluralize( $interval->s, 'second' ). ' ';
return $string . $suffix;
}

Я хочу пройти следующие тесты.

$date1 = new DateTime("2014-05-10 20:00:00");
$date2 = new DateTime("2015-11-20 19:45:00");

//This should produce "1 year, 6 months, 9 days, 23 hours, 45 minutes"//But it does produce "1 year, 6 months, 10 days, 45 minutes"timeDiff($date1, $date2);

$date3 = new DateTime("2015-11-20 20:00:00");

//This should, and does produce "1 year, 6 months, 10 days"timeDiff($date1, $date3);

Это выглядит как версия проблемы указал в комментариях @Джон Конде. Это исправлено в новой версии PHP 5.4.24 и далее. Как я могу это исправить для предыдущей версии PHP?

0

Решение

Я полагаю, ваше требование — показать истекшее время между двумя элементами данных DateTime, представленными в вашем местном времени. (Если это не ваше требование, пожалуйста, обновите ваш вопрос).

Я также думаю, что ваши элементы DateTime созданы правильно в местном часовом поясе. Вы можете проверить местный часовой пояс с помощью date_default_timezone_get() и установить его с date_default_timezone_set('Australia/Sydney') например.

Возможно, человек, управляющий вашим сервером, неверно установил часовой пояс сервера по умолчанию или он находится в другом часовом поясе от вас. Также возможно, что для него установлено UTC (также известное как Zulu или Z time, ранее известное как Среднее время по Гринвичу или GMT). В этом случае вам нужно явно указать местный часовой пояс в вашей программе.

Как только вы правильно установили часовой пояс, создайте элементы DateTime. Затем конвертируйте оба элемента DateTime в UTC. Затем вычислите разницу. Нечто подобное должно сделать свое дело.

 $utczone = new DateTimeZone('UTC');
timeDiff($date1->setTimezone($utczone), $date2->setTimezone($utczone));
1

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

Других решений пока нет …

По вопросам рекламы [email protected]