Как вычесть две даты, игнорируя переход на летнее время в 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 

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

(Примечание: это должно выполняться в соответствии с php 5.1.6, поэтому некоторые функции даты в 5.3 могут быть недоступны.)

Немного больше информации: я собираюсь принять смещение и добавить его к другим датам, которые находятся в db, и я хочу изменить только часть дня, а не часть времени. Оказывается, округление не будет работать, так или иначе, потому что, когда я делаю добавление, он уходит на один час в другом направлении. Может быть, есть лучший подход ко всей проблеме …

Related of "Как вычесть две даты, игнорируя переход на летнее время в PHP?"

вы можете использовать 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 

Вы можете принудительно округлить в определенном направлении, используя floor() или ceil() .

Я попробовал код «UTC» выше. Не работает для меня. Я получил десятичные значения.

Когда в пределах диапазона дат есть летнее время, раздельная последовательная десятичная часть будет либо меньше 0,5 или более. когда диапазон дат имеет дневное свечение, продолжающееся 3/15, десятичное значение составляет> .5, когда дневной свет уходит с десятичной даты <.5. поэтому я просто помещаю разницу в функцию round (), и я получаю целые числа, которые мне нужны в течение нескольких дней.