Я знаю, что есть много вопросов и ответов об этом, но, к сожалению, я думаю, что моя ситуация может быть уникальной? По некоторым причинам изменение времени, по-видимому, заставляет вычислять день как на один день меньше, чем он должен вычислять.
Вот мой PHP, который я использовал, и он отлично работает, пока он не начнет перекрывать дату начала и окончания, которая была ПЕРЕД летней экономией, и ПОСЛЕ перехода на летнее время соответственно (FYI, это недавняя проблема, поскольку начинается летнее время эти выходные!):
//$lastDate and $firstDate are 2 unix timestamps with valid month, day, and year values. //The times are irrelevant at this point, they are only meant to represent a day. //I start by making sure these have the same time values. $lastDate = mktime(23, 59, 59, date("m", $lastDate), date("j", $lastDate), date("Y", $lastDate)); $firstDate = mktime(23, 59, 59, date("m", $firstDate), date("j", $firstDate), date("Y", $firstDate)); //Then calculate the total number of days in between. $totalDays = abs(floor(($firstDate - $lastDate)/(60*60*24)));
Таким образом, чтобы быть понятным, вышеупомянутое работает, если я не перекрываю изменение летнего времени …
Для справки:
Как найти даты между двумя указанными датами?
Фактические дни между двумя временными метками unix в PHP
Поиск дней между двумя временными метками unix в php
И я все еще на PHP 5.2 прямо сейчас.
EDIT / UPDATE:
Я нашел следующее по этим ссылкам:
Как найти даты между двумя указанными датами?
а также
Как рассчитать интервал между 2 временными метками unix в php БЕЗ деления на 86400 (60 * 60 * 24)
//$lastDate and $firstDate are 2 unix timestamps with valid month, day, and year values. //The times are irrelevant at this point, they are only meant to represent a day. //I start by making sure these have the same time values. $lastDate = mktime(10, 00, 00, date("m", $lastDate), date("j", $lastDate), date("Y", $lastDate)); $firstDate = mktime(10, 00, 00, date("m", $firstDate), date("j", $firstDate), date("Y", $firstDate)); //Then calculate the total number of days in between. $totalDays = floor($firstDate / 86400) - floor($lastDate/ 86400);
И, похоже, это работает сейчас для кроссовера DST. Кто-нибудь видит какие-либо проблемы с этим?
Вы работаете на PHP 5.3+? DateInterval
подходит к проблеме хорошо.
http://www.php.net/manual/en/datetime.diff.php
<?php $datetime1 = new DateTime('2009-10-11'); $datetime2 = new DateTime('2009-10-13'); $interval = $datetime1->diff($datetime2); echo $interval->format('%R%a days');