Как вычесть две даты, игнорируя переход на летнее время в PHP?
Вопрос
Я пытаюсь рассчитать количество дней между двумя днями, но у меня возникают проблемы с переходом на летнее время.Вот мой код:
function date_diff($old_date, $new_date) {
$offset = strtotime($new_date) - strtotime($old_date);
return $offset/60/60/24;
}
Работает нормально, пока оба дня находятся в пределах одного и того же летнего периода:
echo date_diff('3/15/09', '3/18/09'); // 3
Но не в том случае, если они будут дальше друг от друга:
echo date_diff('11/15/08', '3/18/09'); // 122.95833333333
Я хочу четное количество дней, и мне наплевать на летнее время.Я полагаю, я мог бы округлить результат, но это кажется неуклюжим.Есть ли лучший (простой) способ?Я не хочу писать о том, что целый день нужно анализировать и подсчитывать, избегая високосных лет, если я могу этого избежать.
(Примечание:это должно выполняться под управлением php 5.1.6, поэтому некоторые функции date в 5.3 могут быть недоступны.)
Немного больше информации:Я собираюсь взять смещение и добавить его к другим датам, которые есть в базе данных, и я хочу, чтобы изменялась только дневная часть, а не временная.Оказывается, округление все равно не сработает, потому что, когда я делаю сложение, оно отклоняется на один час в другую сторону.Может быть, есть лучший подход ко всей проблеме....
Решение
вы могли бы использовать http://ca3.php.net/date_default_timezone_set установить часовой пояс на GMT, чтобы смещения не было.
В качестве альтернативы, вы можете вручную добавить смещение, используя date('I',$timetamp)
if ( date("I") == 1 ) { // "WE ARE MDT";
$timeZone = "MDT";
} else {
$timeZone = "MST";
}
Другие советы
Принудительно переводите даты в часовой пояс без перехода на летнее время, GMT /UTC:
function date_diff($old_date, $new_date) {
$offset = strtotime($new_date . " UTC") - strtotime($old_date . " UTC");
return $offset/60/60/24;
}
echo date_diff('3/15/09', '3/18/09'); // 3
echo date_diff('11/15/08', '3/18/09'); // 123
Я попробовал приведенный выше код "UTC".У меня это не сработало.Я получу десятичные значения.
При переходе на летнее время в пределах диапазона дат разница в десятичной части порядкового номера будет либо меньше .5, либо больше.когда в диапазоне дат режим экономии дневного света включен 3/15, десятичное значение равно > .5, когда дневной свет отключен, дата десятичная < .5.поэтому я просто помещаю порядковый номер разницы в функцию round () и получаю целые числа, которые мне нужны для количества дней.