Получение первого и последнего дня недели или месяца с помощью С#

  • Михаил
  • 12 мин. на прочтение
  • 56
  • 25 Nov 2022
  • 25 Nov 2022

Недавно мне нужно было получить дату первого дня определенной недели в С#. Просмотрев эту довольно запутанную коллекцию ответов , я собрал части различных фрагментов кода в эту небольшую коллекцию служебных методов.

public static partial class DateTimeExtensions 
{
    public static DateTime FirstDayOfWeek(this DateTime dt)
    {
        var culture = System.Threading.Thread.CurrentThread.CurrentCulture;
        var diff = dt.DayOfWeek - culture.DateTimeFormat.FirstDayOfWeek;

        if (diff < 0)
        {
            diff += 7;
        }

        return dt.AddDays(-diff).Date;
    }

    public static DateTime LastDayOfWeek(this DateTime dt) =>
        dt.FirstDayOfWeek().AddDays(6);

    public static DateTime FirstDayOfMonth(this DateTime dt) =>
        new DateTime(dt.Year, dt.Month, 1);

    public static DateTime LastDayOfMonth(this DateTime dt) =>
        dt.FirstDayOfMonth().AddMonths(1).AddDays(-1);

    public static DateTime FirstDayOfNextMonth(this DateTime dt) =>
        dt.FirstDayOfMonth().AddMonths(1);
}

Этот FirstDayOfWeekметод чувствителен к культуре, поэтому в en-GBкультуре первым днем ​​будет понедельник, тогда как в en-USкультуре это будет воскресенье. Учитывая это, теперь вы можете легко получить границы месяца и недели для любого заданного значения DateTime:

var firstdayOfThisWeek = DateTime.Now.FirstDayOfWeek();

Надеюсь, кто-то еще найдет это полезным!