Questo esempio
C# mostra come calcolare il
numero di settimane presenti in un mese.
Per capire come funziona il
codice va prima chiarito cosa si intende per
settimana.
Questo perché, ad esempio in
Italia, la settimana inizia con il
lunedì (monday) mentre in altri stati, come ad esempio in
America, la settimana inizia con la
domenica (sunday).
Inoltre per le settimane iniziali e finali, ovvero quelle settimane che hanno meno di 7 giorni, va definito se devono essere conteggiate o meno. Ad esempio si può considerare le settimana con almeno 4gg come completa e quindi da aggiungere al conteggio finale.
La funzione seguente,
GetWeekInMonth, fa proprio questo, accetta come parametro una data nel mese, il numero di giorni per considerare la settimana completa e il giorno con cui inizia la settimana:
public int GetWeeksInMonth(DateTime date, DayOfWeek startDayOfWeek = DayOfWeek.Monday, int minDays = 4)
{
int weeks = 0;
var firstDate = date.Date.AddDays(-date.Day + 1);
var firstDayOfWeek = firstDate.DayOfWeek;
int daysStart = 7 - ((int)firstDayOfWeek - (int)startDayOfWeek);
// prima settimana considerata intera
if (daysStart >= minDays)
weeks++;
var daysInMonth = firstDate.AddMonths(1).AddDays(-1).Day;
// settimane centrali, intere di 7 giorni
int weeksComplete = (daysInMonth - daysStart) / 7;
weeks += weeksComplete;
// last week
int daysEnd = daysInMonth - (daysStart + weeksComplete * 7);
if (daysEnd >= minDays)
weeks++;
return weeks;
}
che va richiamata con
var dt = new DateTime(2022, 7, 22);
// settimana che inizia da lunedi
int weekN1 = GetWeeksInMonth(dt);
Console.WriteLine($"Date: {dt}, Weeks: {weekN1}");
// Date: 22/07/2021 00:00:00, Weeks: 4
// settimana che inizia da domenica
int weekN2 = GetWeeksInMonth(dt, DayOfWeek.Sunday, 4);
Console.WriteLine($"Date: {dt}, Weeks: {weekN2 }");
// Date: 22/07/2021 00:00:00, Weeks: 5