Как вычесть две даты, игнорируя переход на летнее время в PHP? - PullRequest
1 голос
/ 30 апреля 2009

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

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, поэтому некоторые функции даты в 5.3 могут быть недоступны.)

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

Ответы [ 4 ]

7 голосов
/ 30 апреля 2009

Принудительное указание дат в часовом поясе без перехода на летнее время, 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
2 голосов
/ 30 апреля 2009

вы можете использовать http://ca3.php.net/date_default_timezone_set для установки часового пояса на GMT, чтобы смещения не было.

Кроме того, вы можете вручную добавить смещение, используя date('I',$timetamp)

if ( date("I") == 1 ) {      // "WE ARE MDT";  
        $timeZone = "MDT";  
} else {  
        $timeZone = "MST";  
}  
0 голосов
/ 18 марта 2010

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

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

0 голосов
/ 30 апреля 2009

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

...