Як я можу отримати DateTime для початку тижня?


469

Як мені знайти початок тижня (і неділю, і понеділок), знаючи лише поточний час у C #?

Щось на зразок:

DateTime.Now.StartWeek(Monday);

Відповіді:


746

Використовуйте метод розширення. Вони - відповідь на все, знаєте! ;)

public static class DateTimeExtensions
{
    public static DateTime StartOfWeek(this DateTime dt, DayOfWeek startOfWeek)
    {
        int diff = (7 + (dt.DayOfWeek - startOfWeek)) % 7;
        return dt.AddDays(-1 * diff).Date;
    }
}

Які можна використовувати наступним чином:

DateTime dt = DateTime.Now.StartOfWeek(DayOfWeek.Monday);
DateTime dt = DateTime.Now.StartOfWeek(DayOfWeek.Sunday);

15
Ви можете спростити це так: int diff = dayOfWeek - dt.DayOfWeek; return dt.AddDays(diff).Date;
Троя

13
Трой, я не вірю, що ваш код працює, якщо вказана дата - неділя, а початок тижня - понеділок. Він повернеться (неділя + 1) замість (неділя - 6)
Аарон Гофман

1
Це не працює, якщо dtє UTC, і це вже початок тижня, наприклад 2012-09-02 16:00:00Z, Mon, 03 Sep 2012 00:00:00за місцевим часом. Тому потрібно перейти dtна місцевий час або зробити щось розумніше. Також потрібно було б повернути результат як UTC, якщо введенням було UTC.
ряд1

1
@ row1 DateTime.Parse("2012-09-02 16:00:00Z")повертає еквівалент локального часу, і цей метод правильно повертає той самий час, що і місцевий час. Якщо ви DateTime.Parse("2012-09-02 16:00:00Z").ToUniversalTime()явно передаєте час UTC, цей метод правильно повертається на 6 днів, 16 годин раніше, як час UTC. Працює саме так, як я очікував.
Роулінг

1
Іноді це для мене буде вимкнено одним днем. Це працювало для мене, коли я знімав компонент часу dt. Я використавint diff = dt.Date.DayOfWeek - startOfWeek;
Вінсент Саельцлер

80

Найшвидший спосіб, який я можу придумати, це:

var sunday = DateTime.Today.AddDays(-(int)DateTime.Today.DayOfWeek);

Якщо ви хочете, щоб будь-який інший день тижня був вашою початковою датою, все, що вам потрібно зробити, - додати до кінця значення DayOfWeek

var monday = DateTime.Today.AddDays(-(int)DateTime.Today.DayOfWeek + (int)DayOfWeek.Monday);

var tuesday = DateTime.Today.AddDays(-(int)DateTime.Today.DayOfWeek + (int)DayOfWeek.Tuesday); 

2
найпростіші відповіді - найкращі, цей працював чудово, але культура залежала
Червесер

7
У Латвії тиждень починається з понеділка. Насправді .. Мені завжди цікаво, як може розпочатися тиждень у неділю .. мені здається незручним ..;)
0xDEAD BEEF

Це рішення добре. Крім того, ви можете зробити початок тижня в будь-який день, додавши DayOfWeek, з якого ви хочете почати. var sunday = DateTime.Today.AddDays (- (int) DateTime.Today.DayOfWeek); var monday = DateTime.Today.AddDays (- (int) DateTime.Today.DayOfWeek + (int) DayOfWeek.Monday);
Лолігани

7
Цей доданий код не працює в ситуації, описаній Threezol. Якщо ви хочете, щоб початок тижня був понеділком, у неділю підрахунок дає наступний понеділок, а не попередній.
Джованні Б

4
Так .. Для неділі вона дає наступний Модней .. не попередній: П
Аджай Арадхя

64

Трохи докладніше та культурі:

System.Globalization.CultureInfo ci = 
    System.Threading.Thread.CurrentThread.CurrentCulture;
DayOfWeek fdow = ci.DateTimeFormat.FirstDayOfWeek;
DayOfWeek today = DateTime.Now.DayOfWeek;
DateTime sow = DateTime.Now.AddDays(-(today - fdow)).Date;

4
отримав помилку з цим: сьогодні = НЕДІЛЯ; fdow = понеділок; (сьогодні - fdow) == -1; DateTime.Now.AddDays (- (- 1)). Date == DateTime.Now.AddDays (+1) .Date; 01-02-2010! = 25-01-2010 !!
balexandre

3
Якщо ви спробуєте це в неділю, то в основному це роблять AddDays (0 - 1) для en-GB. Тож йому потрібна заява @ Sarcastic's if
Chris S

3
Ви також можете отримати поточну культуру, використовуючи CultureInfo.CurrentCultureзамість того, щоб витягувати її з теми. Схоже, дивний спосіб отримати доступ до нього.
Хенк

7
Ще одне питання: небезпечно дзвонити у Nowвласність двічі. Якщо поточний час минув 24:00 (або 12:00 опівночі) між двома дзвінками, дата зміниться.
Jeppe Stig Nielsen

1
Ця відповідь насправді полягає в наступному: "всередині поточного тижня .NET (починаючи з неділі і закінчуючи в суботу, відповідно до нумерації перерахунку DayOfWeek), знайдіть день .NET тижня, який є першим за тиждень в сучасній культурі ». Це, мабуть, не те, що ви хочете.
Матьє Ренда

36

Використання вільного часу часу :

var monday = DateTime.Now.Previous(DayOfWeek.Monday);
var sunday = DateTime.Now.Previous(DayOfWeek.Sunday);

29
Мені б не хотілося брати на себе залежність саме від цього. "Знайте свої залежності і вбивайте їх", здається, приходить в голову. :)
Естебан Арая

7
Хтось помітив, ЯК "Fluent" працює? Просто погляньте на код. Він використовує цикл do ... while. Не хочу називати це іменами, але якщо я вирішу це зробити, це не буде приємно. public static DateTime Previous(this DateTime start, DayOfWeek day) { do { start = start.PreviousDay(); } while (start.DayOfWeek != day); return start; }
nsimeonov

10
@nsimeonov це відкритий код. будь ласка, не соромтеся забезпечити кращу реалізацію, а не кидати каміння.
Саймон

12
Так, ніби мені довелося весь час у світі виправляти кожну помилку у кожному програмному забезпеченні з відкритим кодом у світі ...
nsimeonov

4
Мені довелося коментувати, бо я отримав величезний сміх із скарги на використання циклу "do ... while"! Веселий! Я ніколи раніше не чув, щоб інший програміст здригався про цикл. Дуже хотів би побачити обличчя цього клоуна, коли / якщо він коли-небудь зрозуміє, що насправді складається з його коду.
Джош Стодола

22

Некрасивий, але він принаймні дає правильні дати

З початком тижня встановлюється системою:

    public static DateTime FirstDateInWeek(this DateTime dt)
    {
        while (dt.DayOfWeek != System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat.FirstDayOfWeek)
            dt = dt.AddDays(-1);
        return dt;
    }

Без:

    public static DateTime FirstDateInWeek(this DateTime dt, DayOfWeek weekStartDay)
    {
        while (dt.DayOfWeek != weekStartDay)
            dt = dt.AddDays(-1);
        return dt;
    }

3
Це дійсно заслуговує на більше голосів за свою простоту і читабельність.
ПрофК

Цей ресурс також допоміг: markb.uk/… (Якщо ви хочете отримати перший / останній день тижня чи місяця).
FranzHuber23

13

Давайте поєднаємо відповідь, безпечна для культури та відповідь методу розширення:

public static class DateTimeExtensions
{
    public static DateTime StartOfWeek(this DateTime dt, DayOfWeek startOfWeek)
    {
        System.Globalization.CultureInfo ci = System.Threading.Thread.CurrentThread.CurrentCulture;
        DayOfWeek fdow = ci.DateTimeFormat.FirstDayOfWeek;
        return DateTime.Today.AddDays(-(DateTime.Today.DayOfWeek- fdow));
    }
}

12
ні dt, ні startOfWeek не використовуються у межах вашої функції, я думаю, перший слід використовувати замість DateTime.Today
hultqvist

2
У контексті запитання потрібно, щоб додаткова властивість використовувалась відключенням Datetime таким же чином, як .Today або. Now. Я погоджуюся, що це незручно, але це те, про що просили.
Joel Coehoorn

7
Я знаю, що це стара відповідь, але це не так на багатьох рівнях; окрім того, що повністю ігнорує аргументи методу, математика в багатьох випадках спричинить його вибір майбутньої дати. Це повинно бути написано, щоб використовувати dtзамість DateTime.Today, щоб обернути математику в, (offset + 7) % 7щоб забезпечити негативне зміщення, використовувати перевантаження методу з одним параметром, який передає поточну культуру FirstDayOfWeekяк startOfWeekаргумент, і, можливо, (залежно від специфікації), щоб примусити нульове зміщення до 7-денного зміщення, так що "минулий вівторок" не повернеться сьогодні, якщо вже вівторок.
Aaronaught

10

Це дасть вам попередню неділю (я думаю):

DateTime t = DateTime.Now;
t -= new TimeSpan ((int) t.DayOfWeek, 0, 0, 0);

9

Це може бути трохи хаком, але ви можете передати властивість .DayOfWeek до int (це перерахунок, а оскільки його не було базового типу даних, змінив значення за замовчуванням на int) і використовувати це для визначення попереднього початку тижня .

Здається, що тиждень, зазначений у перерахунку DayOfWeek, починається в неділю, тому якщо від цього значення відняти 1, це буде рівною кількості днів понеділка перед поточною датою. Нам також потрібно віднести неділю (0) до рівня 7, тому 1 - 7 = -6, неділя буде відображатися на попередній понеділок: -

DateTime now = DateTime.Now;
int dayOfWeek = (int)now.DayOfWeek;
dayOfWeek = dayOfWeek == 0 ? 7 : dayOfWeek;
DateTime startOfWeek = now.AddDays(1 - (int)now.DayOfWeek);

Код за попередню неділю простіший, оскільки нам не доведеться робити це коригування: -

DateTime now = DateTime.Now;
int dayOfWeek = (int)now.DayOfWeek;
DateTime startOfWeek = now.AddDays(-(int)now.DayOfWeek);

9

На понеділок

DateTime startAtMonday = DateTime.Now.AddDays(DayOfWeek.Monday - DateTime.Now.DayOfWeek);

На неділю

DateTime startAtSunday = DateTime.Now.AddDays(DayOfWeek.Sunday- DateTime.Now.DayOfWeek);

1
У мене була інша потреба в застосуванні, однак я використовував це, щоб змусити мене йти. Мені це подобається, тому що це найпростіший, без будь-якого кастингу - збереження операцій у однакових / відповідних типах.
qxotk

1
Це не працює, коли день неділя. Це дає наступний понеділок, а не початок поточного тижня.
Грант J

Також ви копіювали неділю чи понеділок. У мене є 2 відповіді. Один, якщо ви хочете в понеділок і 2, якщо ви хочете в неділю ..... Я просто перевірив це, і він добре працює для мене. DateTime.Now.DayOfWeek; Неділя та результат DateTime.Now.AddDays (DayOfWeek.Sunday - DateTime.Now.DayOfWeek); {10/11/2019 4:14:55 µμ} Дата: {10/11/2019 12:00:00 πμ} День: 10 ДеньOfWeek: День неділіЗроку: 314 Година: 16 Вид: Місцевий Мільсекунд: 172 Хвилина: 14 Місяць : 11 Друге: 55 Тиксів: 637089992951723516 TimeOfDay: {16: 14: 55.1723516} Рік: 2019
Джордж

@GrantJ Який рядок ти взяв ??? Я щойно тестував, і це працює чудово.
Джордж

Я спробував перший, замінивши ваш DateTime.Now з DateTime, що представляє неділю 10 листопада 2019. Він повинен дати понеділка 4 листопада 2019 року, але він дає понеділок 11 листопада 2019. Я створив тут скрипку, яка демонструє це: dotnetfiddle.net/ Jw3ZiO
Грант J

5
using System;
using System.Globalization;

namespace MySpace
{
    public static class DateTimeExtention
    {
        // ToDo: Need to provide culturaly neutral versions.

        public static DateTime GetStartOfWeek(this DateTime dt)
        {
            DateTime ndt = dt.Subtract(TimeSpan.FromDays((int)dt.DayOfWeek));
            return new DateTime(ndt.Year, ndt.Month, ndt.Day, 0, 0, 0, 0);
        }

        public static DateTime GetEndOfWeek(this DateTime dt)
        {
            DateTime ndt = dt.GetStartOfWeek().AddDays(6);
            return new DateTime(ndt.Year, ndt.Month, ndt.Day, 23, 59, 59, 999);
        }

        public static DateTime GetStartOfWeek(this DateTime dt, int year, int week)
        {
            DateTime dayInWeek = new DateTime(year, 1, 1).AddDays((week - 1) * 7);
            return dayInWeek.GetStartOfWeek();
        }

        public static DateTime GetEndOfWeek(this DateTime dt, int year, int week)
        {
            DateTime dayInWeek = new DateTime(year, 1, 1).AddDays((week - 1) * 7);
            return dayInWeek.GetEndOfWeek();
        }
    }
}

3
По-перше, ласкаво просимо до спільноти :) На це питання вже є кілька якісних відповідей, більшість з яких були опубліковані сім років тому, коли питання було задано. Хоча це може бути корисною спробою відповісти на прості запитання, наприклад, на це, щоб розширити свої можливості програмування, опублікування цієї відповіді в її нинішньому стані нічого не додасть до питання. Якщо у вашій відповіді є щось нове, будь ласка, візьміть кілька речень, щоб пояснити, як це відрізняється і чому це робить його кращим.
MTCoster

4

З'єднавши все це разом з Глобалізацією та дозволивши визначити перший день тижня як частину дзвінка, який ми маємо

public static DateTime StartOfWeek ( this DateTime dt, DayOfWeek? firstDayOfWeek )
{
    DayOfWeek fdow;

    if ( firstDayOfWeek.HasValue  )
    {
        fdow = firstDayOfWeek.Value;
    }
    else
    {
        System.Globalization.CultureInfo ci = System.Threading.Thread.CurrentThread.CurrentCulture;
        fdow = ci.DateTimeFormat.FirstDayOfWeek;
    }

    int diff = dt.DayOfWeek - fdow;

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

    return dt.AddDays( -1 * diff ).Date;

}

4
var now = System.DateTime.Now;

var result = now.AddDays(-((now.DayOfWeek - System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat.FirstDayOfWeek + 7) % 7)).Date;

2

Це дасть вам опівночі в першу неділю тижня:

DateTime t = DateTime.Now;
t -= new TimeSpan ((int) t.DayOfWeek, t.Hour, t.Minute, t.Second);

Це дає вам перший понеділок опівночі:

DateTime t = DateTime.Now;
t -= new TimeSpan ((int) t.DayOfWeek - 1, t.Hour, t.Minute, t.Second);

2

спробуйте це в c #. За допомогою цього коду ви можете отримати як першу дату, так і останню дату тижня. Ось неділя - перший день, а субота - останній день, але ви можете встановити обидва дні відповідно до своєї культури

DateTime firstDate = GetFirstDateOfWeek(DateTime.Parse("05/09/2012").Date,DayOfWeek.Sunday);
DateTime lastDate = GetLastDateOfWeek(DateTime.Parse("05/09/2012").Date, DayOfWeek.Saturday);

public static DateTime GetFirstDateOfWeek(DateTime dayInWeek, DayOfWeek firstDay)
{
    DateTime firstDayInWeek = dayInWeek.Date;
    while (firstDayInWeek.DayOfWeek != firstDay)
        firstDayInWeek = firstDayInWeek.AddDays(-1);

    return firstDayInWeek;
}
public static DateTime GetLastDateOfWeek(DateTime dayInWeek, DayOfWeek firstDay)
{
    DateTime lastDayInWeek = dayInWeek.Date;
    while (lastDayInWeek.DayOfWeek != firstDay)
        lastDayInWeek = lastDayInWeek.AddDays(1);

    return lastDayInWeek;
}

2

Спробував декілька, але не вирішив питання з тижні, починаючи з понеділка, в результаті чого мені прийшов наступний понеділок у неділю. Тому я трохи змінив його і працював з цим кодом:

int delta = DayOfWeek.Monday - DateTime.Now.DayOfWeek;
DateTime monday = DateTime.Now.AddDays(delta == 1 ? -6 : delta);
return monday;

Схоже, що проблема "наступаючого понеділка" залежить від культури (див. Також відповідь Еріка та коментар Червесер.) Однак, якщо вам не потрібно брати до уваги неділю (як це стосується звичайних ділових зустрічей), ваша формула може спрощено:dt.AddDays(DayOfWeek.Monday - dt.DayOfWeek);
Даміан Вогель

2

Крок 1: Створіть статичний клас

  public static class TIMEE
{
    public static DateTime StartOfWeek(this DateTime dt, DayOfWeek startOfWeek)
    {
        int diff = (7 + (dt.DayOfWeek - startOfWeek)) % 7;
        return dt.AddDays(-1 * diff).Date;
    }
    public static DateTime EndOfWeek(this DateTime dt, DayOfWeek startOfWeek)
    {
        int diff = (7 - (dt.DayOfWeek - startOfWeek)) % 7;
        return dt.AddDays(1 * diff).Date;
    }
}

Крок 2. Використовуйте цей клас, щоб отримати і початковий, і кінцевий день тижня

 DateTime dt =TIMEE.StartOfWeek(DateTime.Now ,DayOfWeek.Monday);
        DateTime dt1 = TIMEE.EndOfWeek(DateTime.Now, DayOfWeek.Sunday);

Кінець тижня потрібен (6 - (dt.DayOfWeek - startOfWeek)) % 7мені проти одиничних тестів, які я написав.
mlhDev

1

Наступний метод повинен повернути потрібний час DateTime. Передайте правду для неділі, що є першим днем ​​тижня, помилковим для понеділка:

private DateTime getStartOfWeek(bool useSunday)
{
    DateTime now = DateTime.Now;
    int dayOfWeek = (int)now.DayOfWeek;

    if(!useSunday)
        dayOfWeek--;

    if(dayOfWeek < 0)
    {// day of week is Sunday and we want to use Monday as the start of the week
    // Sunday is now the seventh day of the week
        dayOfWeek = 6;
    }

    return now.AddDays(-1 * (double)dayOfWeek);
}

1

Дякую за приклади. Мені потрібно було завжди використовувати "CurrentCulture" перший день тижня, і для масиву мені потрібно було знати точний номер дня .. тому ось мої перші розширення:

public static class DateTimeExtensions
{
    //http://stackoverflow.com/questions/38039/how-can-i-get-the-datetime-for-the-start-of-the-week
    //http://stackoverflow.com/questions/1788508/calculate-date-with-monday-as-dayofweek1
    public static DateTime StartOfWeek(this DateTime dt)
    {
        //difference in days
        int diff = (int)dt.DayOfWeek - (int)CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek; //sunday=always0, monday=always1, etc.

        //As a result we need to have day 0,1,2,3,4,5,6 
        if (diff < 0)
        {
            diff += 7;
        }
        return dt.AddDays(-1 * diff).Date;
    }

    public static int DayNoOfWeek(this DateTime dt)
    {
        //difference in days
        int diff = (int)dt.DayOfWeek - (int)CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek; //sunday=always0, monday=always1, etc.

        //As a result we need to have day 0,1,2,3,4,5,6 
        if (diff < 0)
        {
            diff += 7;
        }
        return diff + 1; //Make it 1..7
    }
}

1

Здається, ніхто ще не відповів на це правильно. Я вставлю тут своє рішення на випадок, якщо комусь це потрібно. Наступний код працює незалежно від того, чи перший день тижня - понеділок чи неділя чи щось інше.

public static class DateTimeExtension
{
  public static DateTime GetFirstDayOfThisWeek(this DateTime d)
  {
    CultureInfo ci = System.Threading.Thread.CurrentThread.CurrentCulture;
    var first = (int)ci.DateTimeFormat.FirstDayOfWeek;
    var current = (int)d.DayOfWeek;

    var result = first <= current ?
      d.AddDays(-1 * (current - first)) :
      d.AddDays(first - current - 7);

    return result;
  }
}

class Program
{
  static void Main()
  {
    System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("en-US");
    Console.WriteLine("Current culture set to en-US");
    RunTests();
    Console.WriteLine();
    System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("da-DK");
    Console.WriteLine("Current culture set to da-DK");
    RunTests();
    Console.ReadLine();
  }

  static void RunTests()
  {
    Console.WriteLine("Today {1}: {0}", DateTime.Today.Date.GetFirstDayOfThisWeek(), DateTime.Today.Date.ToString("yyyy-MM-dd"));
    Console.WriteLine("Saturday 2013-03-02: {0}", new DateTime(2013, 3, 2).GetFirstDayOfThisWeek());
    Console.WriteLine("Sunday 2013-03-03: {0}", new DateTime(2013, 3, 3).GetFirstDayOfThisWeek());
    Console.WriteLine("Monday 2013-03-04: {0}", new DateTime(2013, 3, 4).GetFirstDayOfThisWeek());
  }
}

1

Модуло в C # погано працює для -1mod7 (має бути 6, c # повертає -1), тому ... рішення "oneliner" для цього буде виглядати приблизно так :)

private static DateTime GetFirstDayOfWeek(DateTime date)
    {
        return date.AddDays(-(((int)date.DayOfWeek - 1) - (int)Math.Floor((double)((int)date.DayOfWeek - 1) / 7) * 7));
    }

1

Те саме для кінця тижня (у стилі @Compile Це відповідь):

    public static DateTime EndOfWeek(this DateTime dt)
    {
        int diff = 7 - (int)dt.DayOfWeek;

        diff = diff == 7 ? 0 : diff;

        DateTime eow = dt.AddDays(diff).Date;

        return new DateTime(eow.Year, eow.Month, eow.Day, 23, 59, 59, 999) { };
    }

0

Ви можете скористатися чудовою бібліотекою Umbrella :

using nVentive.Umbrella.Extensions.Calendar;
DateTime beginning = DateTime.Now.BeginningOfWeek();

Однак вони , схоже, зберігають понеділок як перший день тижня (див. Властивість nVentive.Umbrella.Extensions.Calendar.DefaultDateTimeCalendarExtensions.WeekBeginsOn), так що попереднє локалізоване рішення трохи краще. Нещасний.

Редагувати : придивившись ближче до питання, схоже, що парасолька насправді може працювати і для цього:

// Or DateTime.Now.PreviousDay(DayOfWeek.Monday)
DateTime monday = DateTime.Now.PreviousMonday(); 
DateTime sunday = DateTime.Now.PreviousSunday();

Хоча варто зазначити, що якщо ви попросите попереднього понеділка в понеділок, він поверне вам сім днів назад. Але це також справедливо, якщо ви використовуєте BeginningOfWeek, що здається помилкою :(.


0

Це поверне як початок тижня, так і кінець тижня:

    private string[] GetWeekRange(DateTime dateToCheck)
    {
        string[] result = new string[2];
        TimeSpan duration = new TimeSpan(0, 0, 0, 0); //One day 
        DateTime dateRangeBegin = dateToCheck;
        DateTime dateRangeEnd = DateTime.Today.Add(duration);

        dateRangeBegin = dateToCheck.AddDays(-(int)dateToCheck.DayOfWeek);
        dateRangeEnd = dateToCheck.AddDays(6 - (int)dateToCheck.DayOfWeek);

        result[0] = dateRangeBegin.Date.ToString();
        result[1] = dateRangeEnd.Date.ToString();
        return result;

    }

Я розмістив повний код для обчислення початку / кінця тижня, місяця, кварталу та року у своєму блозі ZamirsBlog


0
    namespace DateTimeExample
    {
        using System;

        public static class DateTimeExtension
        {
            public static DateTime GetMonday(this DateTime time)
            {
                if (time.DayOfWeek != DayOfWeek.Monday)
                    return GetMonday(time.AddDays(-1)); //Recursive call

                return time;
            }
        }

        internal class Program
        {
            private static void Main()
            {
                Console.WriteLine(DateTime.Now.GetMonday());
                Console.ReadLine();
            }
        }
    } 

Чи можете ви розширити свою відповідь, щоб включити пояснення свого коду? Це допомагає читачеві більше, ніж можна подумати.
gunr2171

Використання рекурсії - це дуже погана реалізація. Тільки тому, що ви могли використовувати рекурсії, не означає, що слід. Це було б повільніше та інтенсивніше пам'яті, ніж інші рішення, що надаються тут.
mikecamimo

0

Ось поєднання кількох відповідей. Він використовує метод розширення, який дозволяє передавати культуру, якщо вона не передається, використовується поточна культура. Це надасть йому максимальну гнучкість та повторне використання.

/// <summary>
/// Gets the date of the first day of the week for the date.
/// </summary>
/// <param name="date">The date to be used</param>
/// <param name="cultureInfo">If none is provided, the current culture is used</param>
/// <returns>The date of the beggining of the week based on the culture specifed</returns>
public static DateTime StartOfWeek(this DateTime date, CultureInfo cultureInfo=null) =>         
             date.AddDays(-1 * (7 + (date.DayOfWeek - (cultureInfo??CultureInfo.CurrentCulture).DateTimeFormat.FirstDayOfWeek)) % 7).Date;

Приклад використання:

public static void TestFirstDayOfWeekExtension() {          
        DateTime date = DateTime.Now;
        foreach(System.Globalization.CultureInfo culture in CultureInfo.GetCultures(CultureTypes.UserCustomCulture | CultureTypes.SpecificCultures)) {
            Console.WriteLine($"{culture.EnglishName}: {date.ToShortDateString()} First Day of week: {date.StartOfWeek(culture).ToShortDateString()}");
        }
    }

0

якщо ви хочете суботу чи неділю чи будь-який день тижня, але не перевищує поточного тижня (сб-нд), я накрив вас цим кодом.

public static DateTime GetDateInCurrentWeek(this DateTime date, DayOfWeek day)
{
    var temp = date;
    var limit = (int)date.DayOfWeek;
    var returnDate = DateTime.MinValue;

    if (date.DayOfWeek == day) return date;

    for (int i = limit; i < 6; i++)
    {
        temp = temp.AddDays(1);

        if (day == temp.DayOfWeek)
        {
            returnDate = temp;
            break;
        }
    }
    if (returnDate == DateTime.MinValue)
    {
        for (int i = limit; i > -1; i++)
        {
            date = date.AddDays(-1);

            if (day == date.DayOfWeek)
            {
                returnDate = date;
                break;
            }
        }
    }
    return returnDate;
}

0

Нам подобається однолінійний: Отримайте різницю між першим днем ​​тижня культури та поточним днем, а потім відніміть кількість днів від поточного дня

var weekStartDate = DateTime.Now.AddDays(-((int)now.DayOfWeek - (int)DateTimeFormatInfo.CurrentInfo.FirstDayOfWeek));

0

Виходячи з "Скласти цей відповідь", використовуйте наступний метод, щоб отримати дату для будь-якого дня тижня:

public static DateTime GetDayOfWeek(this DateTime dt, DayOfWeek day)
{            
    int diff = (7 + (dt.DayOfWeek - DayOfWeek.Monday)) % 7;
    var monday = dt.AddDays(-1 * diff).Date;

    switch (day)
    {
        case DayOfWeek.Tuesday:
            return monday.AddDays(1).Date;

        case DayOfWeek.Wednesday:
            return monday.AddDays(2).Date;

        case DayOfWeek.Thursday:
            return monday.AddDays(3).Date;

        case DayOfWeek.Friday:
            return monday.AddDays(4).Date;

        case DayOfWeek.Saturday:
            return monday.AddDays(5).Date;

        case DayOfWeek.Sunday:
            return monday.AddDays(6).Date;
    }

    return monday;
}

0

Спробуйте створити функцію, яка використовує рекурсію. Об'єкт DateTime - це вхід, і функція повертає новий об'єкт DateTime, який стоїть на початку тижня.

    DateTime WeekBeginning(DateTime input)
    {
        do
        {
            if (input.DayOfWeek.ToString() == "Monday")
                return input;
            else
                return WeekBeginning(input.AddDays(-1));
        } while (input.DayOfWeek.ToString() == "Monday");
    }

Хоча цей код може вирішити питання, включаючи пояснення, як і чому це вирішує проблему, справді допоможе покращити якість вашої публікації та, ймовірно, призведе до збільшення кількості голосів. Пам'ятайте, що ви відповідаєте на запитання читачів у майбутньому, а не лише про людину, яка зараз задає питання. Будь ласка, відредагуйте свою відповідь, щоб додати пояснення та вказати, які обмеження та припущення застосовуються.
Девід Бак

0

Розрахунок таким чином дозволяє вам вибрати, який день тижня вказує на початок нового тижня (у прикладі, який я вибрав понеділок).

Зауважте, що виконавши цей розрахунок за день, що є понеділком, буде дано поточний понеділок, а не попередній.

//Replace with whatever input date you want
DateTime inputDate = DateTime.Now;

//For this example, weeks start on Monday
int startOfWeek = (int)DayOfWeek.Monday;

//Calculate the number of days it has been since the start of the week
int daysSinceStartOfWeek = ((int)inputDate.DayOfWeek + 7 - startOfWeek) % 7;

DateTime previousStartOfWeek = inputDate.AddDays(-daysSinceStartOfWeek);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.