Ricavare il numero di settimane in un mese in C#
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:
che va richiamata con
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:
C#: GetWeekInMonth
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;
}
C#: Esempio
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