PHP подсчет количества дней между двумя датами - PullRequest
5 голосов
/ 24 августа 2011

Я занимаюсь разработкой веб-приложения, которое вращается вокруг дат.

Мне нужно рассчитать числа, основываясь на количестве прошедших дней, например - псевдокод

$count_only = array('monday', 'wednesday', 'friday'); //count only these days
$start_date = 1298572294;  // a day in the past
$finish_date = 1314210695; //another day

$var = number_of_days_between($start_date, $finish_date, $count_only);

Есть лиспособ определить, сколько полных дней прошло, считая только определенные дни?

Ответы [ 4 ]

3 голосов
/ 24 августа 2011

Вы можете значительно упростить это, рассчитав, сколько полных недель приходится на две указанные даты, а затем выполните некоторые математические расчеты для начала / конца неполных недель, чтобы учесть свисающие даты.

например.

$start_date = 1298572294;  // Tuesday
$finish_date = 1314210695; // Wednesday

$diff = 1314210695-1298572294 = 15638401 -> ~181 days -> 25.8 weeks -> 25 full weeks.

Тогда просто проверить даты свисания:

Tuesday -> add 2 days for Wednesday+Friday to get to the end of the week
Wednesday -> add 1 day for Monday to get to the beginning on the week

Total countable days = (25 * 3) + 2 + 1 = 75 + 3 = 78 countable days
2 голосов
/ 24 августа 2011

Немного более быстрый подход, чем "повторять все дни":

$count_only = array(1, 3, 5); // days numbers from getdate() function
$start_date = 1298572294;
$finish_date = 1314210695;

function days($start_date, $finish_date, $count_only)
{
    $cnt = 0;

    // iterate over 7 days
    for ($deltaDays = 0; $deltaDays < 7; $deltaDays++)
    {
        $rangeStart = $start_date + $deltaDays * 86400;

        // check the weekday of rangeStart
        $d = getDate($rangeStart);
        if (in_array($d['wday'], $count_only))
        {
            $cnt += ceil(($finish_date - $rangeStart) / 604800);
        }
    }

    return $cnt;
}

Идея состоит в том, чтобы подсчитать количество недель, используя некоторые дополнительные смещения для понедельника, вторника, среды и т. Д.

2 голосов
/ 24 августа 2011

Вы можете создать цикл, который переходит на следующий день в массиве $count_only, начиная с $start_date и останавливаясь (возвращаясь из функции) при достижении $end_date.

function number_of_days_between($start_date, $finish_date, $count_only) {
    $count  = 0;
    $start  = new DateTime("@$start_date");
    $end    = new DateTime("@$finish_date");
    $days   = new InfiniteIterator(new ArrayIterator($count_only));
    foreach ($days as $day) {
        $count++;
        $start->modify("next $day");
        if ($start > $end) {
            return $count;
        }
    }
}
2 голосов
/ 24 августа 2011

Конечно, есть способ: -)

Прошедшие дни просто

$elapsed_days = floor(($finish_date-$start_date) / 86400);

Это не даст нужный вам результат. То, что вы могли бы сделать, это следующий (песо) код:

$elapsed_days = floor(($finish_date-$start_date) / 86400);
for(int $i=0;$i<$elapsed_days;$i++){
  $act_day_name = strtolower(date('l',$start_date+$i*86400));
  if(in_array($act_day_name,$count_only){
    // found matching day
  }
}

Что я делаю: Я перебираю каждый день, который находится между обеими датами, получаю имя дня с датой ('l'); и проверьте, находится ли он в массиве. Может потребоваться какая-то тонкая настройка, но это должно помочь вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...