Domanda

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

E per "giorni lavorativi" intendo tutti i giorni esclusi 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, ciò sarebbe un po 'di salsa.

Grazie in anticipo per il genio contribuito.

È stato utile?

Soluzione

Questo farà quello che vuoi. Dovrebbe essere abbastanza facile da convertire in VB.NET, è passato troppo tempo per me, 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--;
}

Altri suggerimenti

Il modo più semplice è probabilmente qualcosa di simile

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

Potrebbe non essere il più efficiente, ma consente di controllare facilmente un elenco di festività.

Ecco un esempio della formula di Steve in VB senza la sottrazione delle festività:

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 insieme a alcune altre funzioni Date * sono esclusive di VB.NET e spesso oggetto di invidia da parte degli sviluppatori C #. Non sono sicuro che sarà molto utile in questo caso, tuttavia.

in generale (nessun codice) -

  • sottrai le date per ottenere il numero di giorni
  • dividi per 7 per ottenere il numero di settimane
  • sottrae il numero di settimane per 2
  • conta il numero di date delle vacanze che rientrano nell'intervallo di date
  • sottrai quel conteggio

giocherellare con le date di inizio / fine in modo che cadano da lunedì a lunedì, quindi aggiungere nuovamente la differenza

[si scusa per le generalità senza codice, è tardi]

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

Ecco un metodo per SQL Server. C'è anche un metodo vbscript sulla pagina. Non esattamente quello che hai chiesto, lo so.

Abbiamo combinato due articoli CodeProject per arrivare a una soluzione completa. La nostra biblioteca non è abbastanza concisa da pubblicare come codice sorgente, ma posso indicarvi i due progetti che abbiamo usato per raggiungere ciò di cui avevamo bisogno. Come sempre con gli articoli CodeProject, leggi i commenti, potrebbero esserci informazioni importanti in essi.

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

Un giorno lavorativo alternativo calc: http://www.codeproject.com/KB/cs/datetimelib.aspx

Giorni di calcolo: http://www.codeproject.com/KB/dotnet/ HolidayCalculator.aspx

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top