2008-10-03 18 views
10

Qual è il modo più semplice per calcolare la quantità di giorni lavorativi da una data? Preferisco VB.NET, ma C# va bene.Data confronto data: conta la quantità di giorni lavorativi da una data?

E per "giorni lavorativi", intendo tutti i giorni escluso sabato e domenica. Se l'algoritmo può anche tenere conto di un elenco di date specifiche di "esclusione" che non dovrebbero essere considerate come giorni lavorativi, sarebbe un piacere.

Grazie in anticipo per il genio contribuito.

risposta

16

Questo farà quello che vuoi. Dovrebbe essere abbastanza facile da convertire in VB.NET, è stato troppo lungo per me essere in grado di farlo però.

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 un metodo per SQL Server. C'è anche un metodo vbscript sulla pagina. Non esattamente quello che hai chiesto, lo so.

13

Il modo più semplice è probabilmente qualcosa come

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

Esso non può essere il più efficiente ma permette per il facile controllo di una lista di case.

+0

Vuoi dire il controllo di fine settimana. Non vacanze : D – ferventcoder

+1

Immagino che intendesse dire che questo particolare algoritmo avrebbe semplificato il controllo di un elenco di festività all'interno del ciclo, se lo si desiderava. – Nathan

3

DateDiff insieme a a few other Date* functions sono unici per VB.NET e spesso oggetto di invidia da parte degli sviluppatori C#. Non sono sicuro che sarà molto utile in questo caso, però.

1

Abbiamo combinato due articoli CodeProject per arrivare a una soluzione completa. La nostra libreria non è abbastanza concisa da postare come codice sorgente, ma posso indicarti i due progetti per raggiungere ciò di cui avevamo bisogno. Come sempre con gli articoli CodeProject, leggi i commenti, potrebbero esserci delle informazioni importanti.

Calcolo giorni lavorativi: http://www.codeproject.com/KB/cs/busdatescalculation.aspx

Un'alternativa giorno lavorativo Calc: http://www.codeproject.com/KB/cs/datetimelib.aspx

Vacanze Calcolo: http://www.codeproject.com/KB/dotnet/HolidayCalculator.aspx

1

in generale (nessun codice) -

  • sottrarre la date per conoscere il numero di giorni
  • dividere per 7 per ottenere il numero di settimane
  • numero
  • sottrazione di settimane i tempi 2
  • contano il numero di date delle vacanze che cadono con l'intervallo di date
  • sottrazione che contano

violino con l'inizio/date di fine in modo che cadono lunedi a lunedi, quindi aggiungere di nuovo la differenza

[scuse per le generalità senza codice, è tardi]

[cf endDate.Subtract (startDate) .TotalDays]

3

Ecco un esempio della formula di Steve in VB senza la sottrazione di vacanza:

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 
Problemi correlati