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

StackOverflow https://stackoverflow.com/questions/804571

  •  03-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top