2008-10-03 7 views
10

Was ist der einfachste Weg, um die Anzahl der Arbeitstage seit einem Datum zu berechnen? VB.NET bevorzugt, aber C# ist in Ordnung..NET Date Compare: Zählen Sie die Anzahl der Arbeitstage seit einem Datum?

Und mit "Werktagen" meine ich alle Tage außer Samstag und Sonntag. Wenn der Algorithmus auch eine Liste spezifischer "Ausschluss" -Daten berücksichtigen kann, die nicht als Arbeitstage zählen sollten, wäre dies Soße.

Vielen Dank im Voraus für das beigetragene Genie.

Antwort

16

Das wird tun, was Sie wollen. Es sollte einfach genug sein, um in VB.NET zu konvertieren, es war zu lang für mich, um es zu tun.

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--; 
} 
1

Here's eine Methode für SQL Server. Es gibt auch eine VBScript-Methode auf der Seite. Nicht genau das, wonach du gefragt hast, ich weiß.

13

Der einfachste Weg ist wahrscheinlich so etwas wie

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

Es ist nicht die effizienteste sein kann, aber es für die einfache Überprüfung einer Liste von Feiertagen erlaubt.

+0

Sie von WEEKENDS meine Prüfung. Nicht Ferien. : D – ferventcoder

+1

Ich denke, er meinte, dass dieser spezielle Algorithmus es einfach machen würde, eine Liste von Feiertagen innerhalb der Schleife zu überprüfen, falls gewünscht. – Nathan

3

DateDiff zusammen mit a few other Date* functions sind einzigartig für VB.NET und oft das Thema der Neid von C# -Entwicklern. Nicht sicher, dass es in diesem Fall sehr hilfreich sein wird.

1

Wir haben zwei CodeProject-Artikel kombiniert, um eine vollständige Lösung zu erhalten. Unsere Bibliothek ist nicht prägnant genug, um als Quellcode zu posten, aber ich kann Sie auf die beiden Projekte hinweisen, mit denen wir das erreicht haben, was wir brauchten. Wie immer bei CodeProject-Artikeln, lesen Sie die Kommentare, dort können wichtige Informationen enthalten sein.

Berechnung Werktag: http://www.codeproject.com/KB/cs/busdatescalculation.aspx

Eine Alternative Arbeitstag berechnet: http://www.codeproject.com/KB/cs/datetimelib.aspx

Berechnung Urlaub: http://www.codeproject.com/KB/dotnet/HolidayCalculator.aspx

1

im Allgemeinen (kein Code) -

  • subtrahieren die Daten die Anzahl der Tage zu bekommen
  • Division durch 7 die Anzahl der Wochen zu bekommen
  • subtrahieren Anzahl der Wochen mal 2
  • die Anzahl der Urlaubsdaten zählt, die
  • subtrahiert mit dem Datumsbereich fallen, die

Geige mit dem Start zählen/Enddaten, so dass sie von Montag bis Montag fällt, dann

den Unterschied wieder hinzufügen [Entschuldigungen für die no-Code Allgemeinheiten, dann ist es zu spät]

[cf endDate.Subtract (startDate) .TotalDays]

3

Hier ist eine Probe von Steves Formel in VB ohne Urlaub Subtraktion:

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 
Verwandte Themen