Я пытаюсь вычислить количество дней между двумя днями, но у меня проблемы с летним временем. Вот мой код:
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, и я хочу изменить только часть дня, а не часть времени. Оказывается, округление не будет работать, так или иначе, потому что, когда я делаю добавление, он уходит на один час в другом направлении. Может быть, есть лучший подход ко всей проблеме …
вы можете использовать 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 (), и я получаю целые числа, которые мне нужны в течение нескольких дней.