Подсчет возраста товара только в будние дни

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

Элемент имеет созданный DATETIME в базе данных, и мне нужно отметить его как старый, если дата создания старше 2 дней. Однако клиент попросил, чтобы возраст учитывал только дни недели (с понедельника по пятницу) и исключал субботу и воскресенье.

Пока мой псевдокод выглядит следующим образом:

now - created_datetime = number_of_days
for(i number_of_days)
  if(created_datetime - i)
    is a weekday, then age++

Должен быть более чистый способ добиться этого? Как если бы предмет очень стареет, перебирая каждый день его возраста, поиск выходного дня сильно повлияет на скорость.

Любые идеи были бы отличными! Спасибо


person David Yell    schedule 12.04.2010    source источник
comment
Вы читали это: stackoverflow.com/questions/336127/   -  person webbiedave    schedule 12.04.2010
comment
Нет, я пропустил это, просто читаю сейчас, выглядит многообещающе   -  person David Yell    schedule 12.04.2010
comment
Этот вопрос меня разобрал! Отличный материал, большое спасибо   -  person David Yell    schedule 12.04.2010
comment
Вам не нужно отмечать вопросы как решенные, просто примите ответ, и количество ответов будет отображаться зеленым цветом, что означает, что ответ принят.   -  person cjk    schedule 12.04.2010
comment
Пожалуйста. Рад, что смог помочь.   -  person webbiedave    schedule 12.04.2010
comment
@ck Ответом является комментарий, таким образом отмечая это. Я не могу отметить ответ, если его нет;)   -  person David Yell    schedule 16.04.2010


Ответы (2)


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

Вот интуиция:

Вычтите из общего возраста объекта количество выходных за время его существования. Обратите внимание, что каждые 7 дней бывает ровно 2 выходных. Добавьте к этому количество выходных дней в оставшиеся дни (тех, которые не входят в полную неделю), и вы получите общее количество выходных дней за время его существования. Вычтите реальный возраст, чтобы получить возраст дня недели.

int weekendCount = 0;
// Check the remainder days that are not in a full week.
for (int i = totalAge % 7; i < 7; i++) {
    if (created_datetime - i is weekend) {
        weekendCount++;
    }
}

weekdayAge = totalNumberOfDays  - (((totalNumberOfDays / 7) * 2) + weekendCount);

Обратите внимание, что деление является целочисленным.

person Ben S    schedule 12.04.2010

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

// if today is saturday, subtract 1 from the day. if its sunday, subtract 2
if (now() is sunday) $now = now() - 2 days;
if (now() is saturday) $now = now() - 1 day;

// same thing for $date posted.  but adding 1 or 2 days
if ( $date is saturday) $date = $date + 2;
if ( $date is sunday) $date = $date + 1;

// get days difference
$days = $today - $date;
// have to subtract 2 days for every 7
$days = $days - floor($days/7)*2

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

person pocketfullofcheese    schedule 12.04.2010
comment
При этом не учитывается правильный возраст для всех дней недели. Например, если созданная дата - пятница, а сегодня - понедельник, вы говорите, что ей 3 дня, но ему всего 1 день. - person Ben S; 12.04.2010
comment
как я уже сказал, я не проработал детали. Но вам просто нужно позаботиться о кодировании некоторых из этих крайних случаев, и все будет в порядке. Общая идея такая же. do days - floor ($ days / 7) * 2 и обрабатывать крайние случаи - person pocketfullofcheese; 12.04.2010