.NET Fiddle

CSharp · Console

/Program.cs

using System;
using System.Globalization;
					
public class Program
{
	public static int GetIso8601WeekOfYear(DateTime time)
	{
		DayOfWeek day = CultureInfo.InvariantCulture.Calendar.GetDayOfWeek(time);
		if (day >= DayOfWeek.Monday && day <= DayOfWeek.Wednesday)
		{
			time = time.AddDays(3);
		}
		return CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(time, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
	} 
	
	public static int GetNETWeekOfYear(DateTime time) {
		return CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(time, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
	}
	
	public static void Main()
	{
		var startDate = new DateTime(2018, 12, 30);
		var endDate = new DateTime(2019, 1, 20);

		int diff = (7 + (startDate.DayOfWeek - DayOfWeek.Monday)) % 7;
		var weekStartDate = startDate.AddDays(-1 * diff).Date;
		var i = 1;
		var weekEndDate = DateTime.MinValue;	
		while(weekEndDate < endDate) {
			weekEndDate = weekStartDate.AddDays(6);
			var shownStartDate = weekStartDate < startDate ? startDate : weekStartDate;
			var shownEndDate = weekEndDate > endDate ? endDate : weekEndDate;
			Console.WriteLine($"{i++}. Week {GetIso8601WeekOfYear(shownStartDate)} ({GetNETWeekOfYear(shownStartDate)}): {shownStartDate:dd MMMM yyyy} - {shownEndDate:dd MMMM yyyy}");
			weekStartDate = weekStartDate.AddDays(7);
		}
	}
}
;