2010-04-12 3 views
0

Я пытался подсчитать возраст чего-то в будние дни. Я пробовал метод, подробно описанный в этом вопросе, Given a date range how to calculate the number of weekends partially or wholly within that range?, но, похоже, он не подходит для моего использования.С учётом возраста элемента только в будние дни

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

До сих пор мой псевдо-код выглядит следующим образом,

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

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

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

+1

Вы читали это: http://stackoverflow.com/questions/336127/calculate-business-days-in-php – webbiedave

+0

Нет, я пропустил, что один, просто читая это сейчас, выглядит многообещающим –

+0

Это вопрос отсортирован меня! Отличный материал, спасибо большое –

ответ

0

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

// 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 

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

+0

Это не считается правильным возрастом для всех дней недели. Например, если дата создана в пятницу, а сегодня понедельник, вы говорите, что ей 3 дня, но ей всего 1 день. –

+0

как я уже сказал, я не уточнил детали. Но вам просто нужно беспокоиться о кодировании некоторых из этих случаев, и все будет в порядке. Общая идея такая же. do days - floor ($ days/7) * 2 и обрабатывать крайние случаи – pocketfullofcheese

1

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

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

Смежные вопросы