using System.Collections.Generic;
using System.Globalization;
public static void Main()
var weeklyList = Weekly.GetWeeklyList(5);
var showWeeklyList = new List<Weekly>();
weeklyList.ForEach(i => Console.Write(i.Week + " "));
foreach (var weekly in weeklyList) {
showWeeklyList.Add(weekly);
if (showWeeklyList.Count == 5)
showWeeklyList.RemoveAt(4);
public static int WeekNumber(DateTime date)
DateTime firstDayOfYear = new DateTime(year, 1, 1);
DayOfWeek firstDayOfWeek = firstDayOfYear.DayOfWeek;
if (firstDayOfWeek != DayOfWeek.Monday)
firstDayOfYear = firstDayOfYear.AddDays(-1);
var calendar = CultureInfo.InvariantCulture.Calendar;
return calendar.GetWeekOfYear(date, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
public DateTime Start { get; set; } = DateTime.Now;
public DateTime End { get; set; } = DateTime.Now;
public DateTime Flag { get; set; } = DateTime.Now;
public int Week { get; set; } = 0;
public static List<Weekly> GetWeeklyList(int count = 4)
DateTime now = new DateTime(2025, 1, 1);
List<Weekly> weeklyList = new List<Weekly>();
DateTime currentWeekStart = now.AddDays(-(int)now.DayOfWeek + (int)DayOfWeek.Monday);
DateTime currentWeekEnd = currentWeekStart.AddDays(6);
if (currentWeekStart.Year < currentWeekEnd.Year)
currentWeekEnd = new DateTime(currentWeekStart.Year, 12, 31);
int currentWeekNumber = WeekNumber(currentWeekStart);
if (currentWeekStart.Month == 12 && currentWeekEnd.Year == year + 1)
DateTime firstDayOfNextYear = new DateTime(year + 1, 1, 1);
DateTime firstMondayNextYear = firstDayOfNextYear.AddDays(-(int)firstDayOfNextYear.DayOfWeek + (int)DayOfWeek.Monday);
if (now < firstMondayNextYear)
currentWeekEnd = firstMondayNextYear.AddDays(-1);
for (int i = 0; i < count; i++)
Weekly weekly = new Weekly();
weekly.Start = currentWeekStart;
weekly.End = now < currentWeekEnd ? now : currentWeekEnd;
weekly.Week = currentWeekNumber;
weekly.Flag = currentWeekEnd;
currentWeekStart = currentWeekStart.AddDays(-7);
currentWeekEnd = currentWeekStart.AddDays(6);
currentWeekNumber = WeekNumber(currentWeekStart);
if (weeklyList.Count > count)
weeklyList.RemoveRange(count, weeklyList.Count - count);