.NET Date Compare: contare la quantità di giorni lavorativi da una data?
-
03-07-2019 - |
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.
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