2010-11-02 3 views
24

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

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

Любые идеи, как это сделать?

+0

Возможный дубликат [как найти даты между двумя указанными датами] (http: // stackoverflow.com/questions/2736784/how-to-find-the-dates-between-two-dates-defined) – Gordon

+5

Все эти решения, настраиваемые на 86400, не удастся, когда даты изменят переход на летнее время. –

+0

Mark Baker> Это проблема с временными отметками unix , Использование класса DateTime может быть более подходящим, хотя я не проверял, можем ли мы сделать это легко. –

ответ

37

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

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

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

$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).

+0

Есть ли способ изменить это, чтобы не иметь значения, в каком направлении они находятся? – dotty

+1

Да, используйте функцию abs() для всего объекта. –

+1

Это даст вам количество дней между двумя датами, но не день, месяц или год. –

2

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

//1 day = 86400 seconds 

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

EDIT (пример)

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

    $end_time -= $difference; 
} 

Это должно охватывать любые временные рамки, даже если его через кучу месяцев.

2

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

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

Надеется, что это помогает!

0

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

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

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

+0

Вернет дни - 1. Вам нужно использовать оператор '<='. –

+0

Он сказал между, поэтому я предположил, что это было исключительно. – netcoder

+0

Ах, действительно! Я неправильно понял вопрос, мой плохой. –

0

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

1
$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

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

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

1
**This is a very simple code for find days hours minutes and seconds in php** 

    $dbDate = strtotime("".$yourbdDate.""); // Database date 
    $endDate = time(); // current time 
    $diff = $endDate - $dbDate; /// diffrence 

    $days = floor($diff/86400); /// number of days 
    $hours = floor(($diff-$days*86400)/(60 * 60)); //// number of hours 
    $min = floor(($diff-($days*86400+$hours*3600))/60);///// numbers of minute 


    $second = $diff - ($days*86400+$hours*3600+$min*60); //// secondes 

    if($days > 0) echo $days." Days ago"; 
    elseif($hours > 0) echo $hours." Hours ago"; 
    elseif($min > 0) echo $min." Minute ago"; 
    else echo "Just second ago"; 
Смежные вопросы