Подсчет возраста товара только в будние дни - PullRequest
0 голосов
/ 12 апреля 2010

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

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

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

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

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

Любые идеи были бы великолепны! Спасибо

Ответы [ 2 ]

1 голос
/ 12 апреля 2010

Вам нужно только проверить последние 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);

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

0 голосов
/ 12 апреля 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

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

...