using System.Diagnostics;
public static DateTime A(DateTime d)
var precedingDay = d.AddDays(-1);
var monday = precedingDay.AddDays(-(int)precedingDay.DayOfWeek).AddDays(1);
private static DateTime B(DateTime date)
if (date.DayOfWeek == DayOfWeek.Monday)
int distanceToPrevMonday = date.DayOfWeek - DayOfWeek.Monday;
if (distanceToPrevMonday < 0)
const int BackDistanceFromSundayToMonday = 6;
distanceToPrevMonday = BackDistanceFromSundayToMonday;
return date.AddDays(-distanceToPrevMonday);
private static DateTime C(DateTime date)
var weekStartDay = DayOfWeek.Monday;
int difference = (7 + (date.DayOfWeek - weekStartDay)) % 7;
return date.AddDays(-1 * difference).Date;
public static TimeSpan Bench(int iters, Action bench)
Stopwatch sw = Stopwatch.StartNew();
for (int i = 0; i < iters; i++)
public static void Main()
for (int i = 0; i < 100; i++)
TimeSpan timeA = TimeSpan.Zero;
TimeSpan timeB = TimeSpan.Zero;
TimeSpan timeC = TimeSpan.Zero;
for (int i = 0; i < 365; i++)
DateTime stamp = new DateTime(2021, 1, 1).AddDays(i);
DateTime resultA = DateTime.MaxValue;
DateTime resultB = DateTime.MinValue;
DateTime resultC = DateTime.MinValue;
timeC += Bench(10000, () => resultC = C(stamp));
timeB += Bench(10000, () => resultB = B(stamp));
timeA += Bench(10000, () => resultA = A(stamp));
throw new InvalidOperationException("Does not work");
Console.WriteLine("A: " + timeA.ToString());
Console.WriteLine("B: " + timeB.ToString());
Console.WriteLine("C: " + timeC.ToString());