2010-04-12 21 views
0

J'ai essayé de compter l'âge de quelque chose en semaine. J'ai essayé la méthode détaillée dans cette question, Given a date range how to calculate the number of weekends partially or wholly within that range? mais elle ne semble pas adaptée à mon utilisation.En comptant l'âge d'un article en jours seulement

Un article a un DATETIME créé dans la base de données, et je dois le marquer comme ancien si la date de création a plus de 2 jours. Cependant, le client a demandé que l'âge ne compte que les jours de la semaine (du lundi au vendredi) et exclut Sat + Sun.

Jusqu'à présent, mon code pseudo ressemble à ce qui suit,

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

Il doit y avoir un moyen plus propre d'y parvenir? Comme si un objet devenait très vieux, en boucle chaque jour de son âge, la recherche d'un jour de week-end aurait un impact sur la vitesse.

Toutes les idées seraient géniales! Merci

+1

Avez-vous lu ceci: http://stackoverflow.com/questions/336127/calculate-business-days-in-php – webbiedave

+0

Non, j'ai raté un, en train de lire maintenant, semble prometteur –

+0

Cette question a trié moi! Très bien, merci beaucoup –

Répondre

0

Je suis sûr que vous pouvez le faire avec quelques maths et un peu de réflexion. Vous devez vérifier quel jour de la semaine l'objet a été créé et quel jour de la semaine il est actuellement. D'abord, vous calculez le nombre de jours qu'il est, comme je suis sûr que vous étiez au début.

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

Vous devrez vérifier si cela fonctionne. Peut-être que vous pouvez faire le calcul sans déplacer votre date avant/après le week-end. Ce n'est peut-être pas parfait, mais c'est la bonne idée. Pas besoin d'itérer.

+0

Ceci ne compte pas l'âge correct pour tous les jours de la semaine. Par exemple, si la date créée est un vendredi, et aujourd'hui, c'est lundi, vous dites qu'il a 3 jours, mais il n'a que 1 jour. –

+0

comme je l'ai dit, je n'ai pas travaillé sur les détails. Mais vous avez juste à vous soucier de coder quelques-uns de ces cas limites et tout ira bien. L'idée générale est la même. faire des jours - plancher ($ jours/7) * 2 et gérer des cas de bord – pocketfullofcheese

1

Il vous suffit de vérifier le les 7 derniers jours pour connaître l'âge exact en jours de la semaine.

est ici l'intuition:

Soustraire de l'âge total de l'objet, le nombre de week-ends dans sa vie. Notez que tous les 7 jours il y a exactement 2 week-ends. Ajoutez à cela le nombre de jours de week-end dans les jours restants (ceux qui ne sont pas dans une semaine complète) et vous devez totaliser le nombre de jours de week-end dans sa vie. Soustraire de l'âge réel pour obtenir l'âge de la semaine.

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); 

Notez que la division est une division entière.