Question

Quel est le moyen le plus simple de calculer le nombre de jours de travail depuis une date? VB.NET a préféré, mais C # est correct.

Et par "jours ouvrables", j'entends tous les jours sauf le samedi et le dimanche. Si l'algorithme peut également prendre en compte une liste de dates spécifiques «d'exclusion» qui ne devraient pas être comptées comme des jours ouvrables, ce serait alors un bonus.

Merci d'avance pour votre génie.

Était-ce utile?

La solution

Cela fera ce que vous voulez. Il devrait être assez facile de convertir en VB.NET, mais le processus a été trop long pour pouvoir le faire.

DateTime start = DateTime.Now;
DateTime end = start.AddDays(9);
IEnumerable<DateTime> holidays = new DateTime[0];

// basic data
int days = (int)(end - start).TotalDays;
int weeks = days / 7;

// check for a weekend in a partial week from start.
if (7- (days % 7) <= (int)start.DayOfWeek)
    days--;
if (7- (days % 7) <= (int)start.DayOfWeek)
    days--;

// lose the weekends
days -= weeks * 2;

foreach (DateTime dt in holidays)
{
    if (dt > start && dt < end)
        days--;
}

Autres conseils

Le moyen le plus simple est probablement quelque chose comme

DateTime start = new DateTime(2008, 10, 3);
DateTime end = new DateTime(2008, 12, 31);
int workingDays = 0;
while( start < end ) {
  if( start.DayOfWeek != DayOfWeek.Saturday
   && start.DayOfWeek != DayOfWeek.Sunday ) {
      workingDays++;
  }
  start = start.AddDays(1);
}

Ce n’est peut-être pas le plus efficace, mais il permet de consulter facilement une liste de jours fériés.

Voici un exemple de la formule de Steve en VB sans la soustraction vacances:

Function CalcBusinessDays(ByVal DStart As Date, ByVal DEnd As Date) As Decimal

        Dim Days As Decimal = DateDiff(DateInterval.Day, DStart, DEnd)
        Dim Weeks As Integer = Days / 7
        Dim BusinessDays As Decimal = Days - (Weeks * 2)
        Return BusinessDays
        Days = Nothing
        Weeks = Nothing
        BusinessDays = Nothing

End Function

DateDiff avec quelques autres fonctions Date * sont uniques à VB.NET et font souvent l'envie des développeurs C #. Je ne suis pas sûr que ce sera très utile dans ce cas, cependant.

en général (pas de code) -

  • soustrayez les dates pour obtenir le nombre de jours
  • divisez par 7 pour obtenir le nombre de semaines
  • soustraire le nombre de semaines fois 2
  • compter le nombre de dates de vacances correspondant à la plage de dates
  • soustrayez ce compte

modifiez les dates de début / fin pour qu'elles tombent du lundi au lundi, puis rajoutez la différence

[excuses pour les généralités sans code, il est tard]

[c.f. endDate.Subtract (startDate) .TotalDays]

Voici une méthode pour SQL Server. Il y a aussi une méthode vbscript sur la page. Ce n'est pas exactement ce que vous avez demandé, je sais.

Nous avons combiné deux articles CodeProject pour parvenir à une solution complète. Notre bibliothèque n'est pas assez concise pour être publiée en tant que code source, mais je peux vous indiquer les deux projets que nous avons utilisés pour obtenir ce dont nous avions besoin. Comme toujours avec les articles CodeProject, lisez les commentaires, ils peuvent contenir des informations importantes.

Calcul des jours ouvrables: http://www.codeproject.com/KB/cs /busdatescalculation.aspx

Un calcul alternatif du jour ouvrable: http://www.codeproject.com/KB/cs/datetimelib.aspx

Calcul des jours fériés: http://www.codeproject.com/KB/dotnet/ HolidayCalculator.aspx

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top