/ / Oblicz datę rozpoczęcia i zakończenia poprzedniego tygodnia - c #

Oblicz datę początkową i końcową poprzedniego tygodnia - c #

Jaki jest najlepszy sposób obliczenia daty rozpoczęcia i zakończenia w poprzednim tygodniu w C #? Czyli dzisiaj 18 marca nastąpi 9 marca (poniedziałek w zeszłym tygodniu) i 15 marca (niedziela w zeszłym tygodniu).

Widziałem to za pomocą DayOfWeek i instrukcji switch, aby obliczyć offset, ale zastanawiałem się, czy istnieje bardziej elegancki sposób.

Odpowiedzi:

56 dla odpowiedzi № 1

Możesz pominąć pętlę while i użyć

DateTime mondayOfLastWeek = date.AddDays( -(int)date.DayOfWeek - 6 );

Zakłada to, że używasz poniedziałku jako pierwszego dnia tygodnia.


23 dla odpowiedzi nr 2
DayOfWeek weekStart = DayOfWeek.Monday; // or Sunday, or whenever
DateTime startingDate = DateTime.Today;

while(startingDate.DayOfWeek != weekStart)
startingDate = startingDate.AddDays(-1);

DateTime previousWeekStart = startingDate.AddDays(-7);
DateTime previousWeekEnd = startingDate.AddDays(-1);

Przeczytaj: Cofnij się o jeden dzień, aż będziemy na początku tego tygodnia, a następnie odejmij siedem, aby dostać się na początek zeszłego tygodnia.


11 dla odpowiedzi nr 3

przy użyciu Fluent DateTime https://github.com/FluentDateTime/FluentDateTime

var dateTime = 1.Weeks().Ago();
var monday = dateTime.Previous(DayOfWeek.Sunday);
var sunday = dateTime.Next(DayOfWeek.Sunday);

3 dla odpowiedzi № 4

Korzystanie z DayOfWeek byłoby sposobem na osiągnięcie tego:

    DateTime date = DateTime.Now.AddDays(-7);
while (date.DayOfWeek != DayOfWeek.Monday)
{
date = date.AddDays(-1);
}

DateTime startDate = date;
DateTime endDate = date.AddDays(7);

0 dla odpowiedzi № 5

Można utworzyć metodę rozszerzenia DateTime, która może być używana z parametrem DayOfWeek:

public static class DateTimeExtension
{
public static DateTime GetPreviousWeekDay(this DateTime currentDate, DayOfWeek dow)
{
int currentDay = (int)currentDate.DayOfWeek, gotoDay = (int)dow;
return currentDate.AddDays(-7).AddDays(gotoDay-currentDay);
}
}

Następnie użyj go w następujący sposób:

DateTime testDate = new DateTime(2017, 01, 21);

Console.WriteLine(testDate.GetPreviousWeekDay(DayOfWeek.Sunday));
Console.WriteLine(testDate.GetPreviousWeekDay(DayOfWeek.Saturday));

0 dla odpowiedzi № 6

Przyjęte rozwiązanie jest w rzeczywistości nieprawidłowe.

Musisz przełączyć się, gdy tydzień „załamuje się”, tj. Kiedy uważa, że ​​tydzień się kończy lub zaczyna, a formuła w przyjętym rozwiązaniu nie.

Nie jest to tak widoczne w poniedziałek, jak początek tygodnia, ale bardziej, jeśli weźmie się pod uwagę czwartek na koniec tygodnia.

Prawidłowa formuła (na czwartek jako dzień zakończenia):

DateTime thu = date.AddDays(-(int)(date.AddDays(-5).DayOfWeek) -1);

W poniedziałek -5 przełączy się na -2.

Przykładowy kod do wydrukowania

        String s = "";
DateTime date = new DateTime(2017, 1, 1);
for (int i = 0; i < 14; i++)
{
date = date.AddDays(1);
DateTime thu = date.AddDays(-(int)(date.AddDays(-5).DayOfWeek) -1);
DateTime mon = date.AddDays(-(int)(date.AddDays(-2).DayOfWeek) -1);
s += date.ToString() + " - Thu: " + thu.ToString() + " - Mon: " + mon.ToString() + "rn";
}
Console.WriteLine(s);