2008-09-17 5 views

Répondre

3
 $datefrom = strtotime($datefrom, 0); 
     $dateto = strtotime($dateto, 0); 

     $difference = $dateto - $datefrom; 

     $days_difference = floor($difference/86400); 
     $weeks_difference = floor($days_difference/7); // Complete weeks 

     $first_day = date("w", $datefrom); 
     $days_remainder = floor($days_difference % 7); 

     $odd_days = $first_day + $days_remainder; // Do we have a Saturday or Sunday in the remainder? 
     if ($odd_days > 7) { // Sunday 
      $days_remainder--; 
     } 
     if ($odd_days > 6) { // Saturday 
      $days_remainder--; 
     } 

     $datediff = ($weeks_difference * 5) + $days_remainder; 

D'ici: http://www.addedbytes.com/php/php-datediff-function/

0

Une façon serait de convertir les dates pour timestamp unix en utilisant strtotime (...), en soustrayant les résultats et div'ing avec 86400 (24 * 60 * 60):

$dif_in_seconds = abs(strtotime($a) - strtotime($b)); 
$daysbetween = $dif_in_seconds/86400; 

ETA: Oh .. Vous vouliez dire les jours de la semaine comme du lundi au vendredi .. Vous ne l'avez pas vu au début ..

+0

Ce introduirait tous les problèmes qui viennent avec timestamp unix. Que se passe-t-il si vous avez une date antérieure à 1970? – baudtack

+0

La solution est parfaitement viable compte tenu de certains domaines de problème. Mais bien sûr, vous avez raison en principe. Bien que je soupçonne que pour la majorité des programmes écrits aujourd'hui, vous ne vous inquiéteriez pas des différences de jours de travail avant 1970. – erlando

+0

erlando, Probablement pas. Je suis juste un peu timide des timestamps Unix et les évite comme la peste de nos jours, parce que j'ai vu ce qui peut arriver quand ils sont utilisés pour représenter des choses qu'ils ne devraient pas. Comme les dates. Crée des problèmes de fuseau horaire. Je pense que le temps est mauvais et nous devrions juste prétendre qu'il n'est pas là. :-p – baudtack

0

Le meilleur moyen est de parcourir toutes les dates entre les dates indiquées et d'obtenir le jour de la semaine pour chaque date . Si c'est un jour de semaine, incrémenter un certain compteur. À la fin du processus, vous obtenez le nombre de jours de la semaine.

Les fonctions PHP mktime() et date() (pour travailler avec les horodatages UNIX) sont vos amis ici.

2

Si vous créez un système de facturation, vous devez penser à les jours fériés, Pâques, etc. Il n'est pas simple à calculer.

La meilleure solution que j'ai jamais vue est de pré-générer une table avec des jours et son type à base de données SQL (ligne par jour = 365 lignes par an) et ensuite effectuer une requête simple.

Vous pouvez trouver cette solution entièrement décrite dans la pensée de Joe Celko dans Ensembles: auxiliaire, temporelle et tableaux virtuels dans SQL

+0

Wow, c'est une solution plutôt unique à ce problème. Il est non seulement évolutif, mais il évolue aussi bien. Incroyable. Bravo à celui qui est venu avec ça. J'ai vu d'innombrables méthodes et algorithmes échouer, mais cela semble solide. – willasaywhat

Questions connexes