Поиск дней между двумя временными метками unix в php

Привет, у меня есть база данных о мероприятиях. Есть 2 поля «начало» и «конец», они содержат отметки времени. Когда администратор вводит эти даты, у них есть возможность установить только день, месяц, год. Таким образом, мы имеем дело только с марками, содержащими дни, месяцы, годы, а не часы, минуты, секунды (часы, минуты и секунды установлены на 0,0,0).

У меня есть событие со временем начала 1262304000 и временем окончания 1262908800. Они преобразуются в 1 января 2010 г. и 8 января 2010 г. Как мне получить все дни между этими отметками времени? Я хочу иметь возможность вернуть 2 января 2010 г. (1262390400), 3 января 2010 г. (1262476800) .. до самого конца. Эти события могут переходить в разные месяцы, скажем, с 28 мая по 14 июня.

Есть идеи, как это сделать?


person dotty    schedule 02.11.2010    source источник


Ответы (7)


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

$numDays = abs($smallestTimestamp - $biggestTimestamp)/60/60/24;

Затем вы можете использовать цикл for для получения дат:

$numDays = abs($smallestTimestamp - $biggestTimestamp)/60/60/24;

for ($i = 1; $i < $numDays; $i++) {
    echo date('Y m d', strtotime("+{$i} day", $smallestTimestamp)) . '<br />';
}

Опять же, если вы не знаете, какая временная метка самая маленькая, вы можете использовать функцию min () (второй аргумент в strtotime).

person Vincent Savard    schedule 02.11.2010
comment
Есть ли способ изменить это так, чтобы не имело значения, в каком направлении они находятся? - person dotty; 02.11.2010
comment
Да, используйте функцию abs () во всем. - person Vincent Savard; 02.11.2010
comment
Это даст вам количество дней между двумя датами, но не день, месяц или год. - person Valentin Flachsel; 02.11.2010
comment
Верно, но тогда вы можете использовать цикл for и strtotime. Я просто отредактирую свой пост. - person Vincent Savard; 02.11.2010
comment
abs становится избыточным, если вы знаете, какая из них меньше, а какая больше. Скорее я бы сделал if($small > $big) list($small,$big) = array($big,$small), чтобы поменять их местами. - person mpen; 26.04.2012
comment
@VincentSavard А как насчет летнего времени? - person Shackrock; 09.03.2013
comment
Я нашел это своим решением: intval (($ big - $ small) / 60/60/24) - person Jonny White; 31.12.2015

Я думаю, что быстрый обходной путь для этого - вычесть количество дней в секундах из end_stamp, пока вы не дойдете до start_tag.

//1 day = 86400 seconds

Я бы построил массив дней, чтобы использовать позже.

РЕДАКТИРОВАТЬ (пример)

$difference = 86400;
$days = array();
while ( $start_time < $end_time )
{
    $days[] = date('M j Y', $end_time);

    $end_time -= $difference;
}

Это должно охватывать любой период времени, даже если он превышает несколько месяцев.

person Etienne Marais    schedule 02.11.2010

Попробуй это:

while($date_start <= $date_end) {
    echo date('M d Y', $date_start) . '<br>';
    $date_start = $date_start + 86400;
}

Надеюсь это поможет !

person Valentin Flachsel    schedule 02.11.2010

$d1=mktime(22,0,0,1,1,2007);
$d2=mktime(0,0,0,1,2,2007);
echo "Hours difference = ".floor(($d2-$d1)/3600) . "<br>";
echo "Minutes difference = ".floor(($d2-$d1)/60) . "<br>";
echo "Seconds difference = " .($d2-$d1). "<br>";


echo "Month difference = ".floor(($d2-$d1)/2628000) . "<br>";
echo "Days difference = ".floor(($d2-$d1)/86400) . "<br>";
echo "Year difference = ".floor(($d2-$d1)/31536000) . "<br>";

http://www.plus2net.com/php_tutorial/date-diff.php

http://www.phpf1.com/tutorial/php-date-difference.html

person zod    schedule 02.11.2010

$daysInBetween = range($startTs, $endTs, 86400);
$secondDay = date('M d Y', $daysInBetween[1]);
/*
$thirdDay = date('M d Y', $daysInBetween[2]);
...
*/

Обратите внимание, что функция range() является включающей.

person Halil Özgür    schedule 02.11.2010

Что-то вроде этого?

$day = $start;
while ($day < $end) {
        $day += 86400;
        echo $day.' '.date('Y-m-d', $day).PHP_EOL;
}

Кстати, 1262304000 - это 31 декабря, а не 1 января.

person netcoder    schedule 02.11.2010
comment
Вернет дней - 1. Нужно использовать оператор <=. - person Valentin Flachsel; 02.11.2010
comment
Он сказал между, так что я предположил, что это было исключительно. - person netcoder; 02.11.2010

получить разницу двух дат и разделить ее на 86400. abs (($ date1 - $ date2) / 86400) даст нужный результат

person bkilinc    schedule 02.11.2010