2011-09-30 15 views
37

Powiel możliwe:
ASP.net get the next tuesdayJak uzyskać datę najbliższej niedzieli?

Biorąc pod uwagę dzień miesiąca, w jaki sposób mogę dostać następną niedzielę od tego dnia?

Więc jeśli przejdę we wtorek 13 września 2011 r., To powróci 18 września.

+5

Przeczytaj 'własność DayOfWeek'. Sprawdź, ile dni przed niedzielą tak jest. Wywołaj 'AddDays', przekazując ten numer. –

+0

Czy to ćwiczenie domowe? Jeśli tak, oznacz to pytanie tagiem "praca domowa" –

+1

co jest nie tak, jeśli mam tylko pętlę i zwiększam dzień i sprawdzam, czy jest to pożądany dzień? przerwać, jeśli tak jest. – codecompleting

Odpowiedz

74

używam tę metodę rozszerzenia:

public static DateTime Next(this DateTime from, DayOfWeek dayOfWeek) 
    { 
     int start = (int)from.DayOfWeek; 
     int target = (int)dayOfWeek; 
     if (target <= start) 
      target += 7; 
     return from.AddDays(target - start); 
    } 
+0

Czy nie używasz podstawowych wartości Enum? –

+3

+1 za zrobienie tego metodą rozszerzenia –

+5

@Spencer K: Zależy, w przypadku dni tygodnia, byłbym bardzo zaskoczony, że zmieni się on w niedalekiej (lub nawet dalekiej) przyszłości ;-) –

3
/// <summary> 
/// Finds the next date whose day of the week equals the specified day of the week. 
/// </summary> 
/// <param name="startDate"> 
/// The date to begin the search. 
/// </param> 
/// <param name="desiredDay"> 
/// The desired day of the week whose date will be returneed. 
/// </param> 
/// <returns> 
/// The returned date is on the given day of this week. 
/// If the given day is before given date, the date for the 
/// following week's desired day is returned. 
/// </returns> 
public static DateTime GetNextDateForDay(DateTime startDate, DayOfWeek desiredDay) 
{ 
    // (There has to be a better way to do this, perhaps mathematically.) 
    // Traverse this week 
    DateTime nextDate = startDate; 
    while(nextDate.DayOfWeek != desiredDay) 
     nextDate = nextDate.AddDays(1D); 

    return nextDate; 
} 

Źródło:

http://angstrey.com/index.php/2009/04/25/finding-the-next-date-for-day-of-week/

23

date.AddDays(7 - (int)date.DayOfWeek) powinno wystarczyć myślę.

date.DayOfWeek zwróci wartość wyliczenia, która reprezentuje dzień (gdzie 0 oznacza niedzielę).

+0

Wprowadziłem małą modyfikację, która działała dobrze dla mnie. DateTime.Today.AddDays (7 - (int) DayOfWeek.Saturday) .ToShortDateString() – dvdmn

+7

Ostrożny dvdnhm, który dodaje 1 dzień do dzisiejszej daty. – Joey

+0

dziękuję za troskę, udało się to dobrze dla mojego celu i wykorzystania go w projekcie .. – dvdmn

5
 var date = DateTime.Now; 
     var nextSunday = date.AddDays(7 - (int) date.DayOfWeek);  

Jeśli potrzebujesz najbliższą niedzielę, kod trochę inaczej (jak jeśli jesteś w niedzielę najbliższą niedzielę jest dzisiaj):

var nearestSunday = date.AddDays(7 - date.DayOfWeek == DayOfWeek.Sunday ? 7 : date.DayOfWeek); 
2

Oto kod:

int dayOfWeek = (int) DateTime.Now.DayOfWeek; 
DateTime nextSunday = DateTime.Now.AddDays(7 - dayOfWeek).Date; 

Zdobądź najpierw wartość liczbową dnia tygodnia, w swoim przykładzie: wtorek = 2

Następnie odejmij od niedzieli, 7 -2 = 5 dni, aby dodać, aby otrzymać datę następnej niedzieli. :)

0
DateTime dt=dateTime; 
do { 
    dt=dt.AddDays(1); 
} while(dt.DayOfWeek!= DayOfWeek.Sunday); 
// 'dt' is now the next Sunday 

Twoje pytanie nie jest jasne, czy ta sama data jest zwracana, jeśli data jest już niedziela; Zakładam, że nie, ale jeśli się mylę, zmień powyższą na pętlę while.

0

Przykład wykorzystania rekurencji

private static DateTime GetNextSunday(DateTime dt) 
    { 
     var tomorrow = dt.AddDays(1); 
     if (tomorrow.DayOfWeek != DayOfWeek.Sunday) 
     { 
      GetNextSunday(tomorrow); 
     } 

     return tomorrow; 
    } 
+2

Chcesz komentować downvoter? Nienawidzę, kiedy ludzie to robią ... –

+0

Ja też tego nie znoszę! Niemniej jednak myślę, że to nie zadziałałoby dobrze. Jak już wspomniano, instancje DateTime są niezmienne i nie używasz nawet wartości zwracanej przez twoją metodę. Kolejną rzeczą, o której warto wspomnieć: Bardzo miło jest umieścić tę funkcję w metodach rozszerzenia, przynajmniej dla mojego gustu. – Kjellski

0
public static DateTime GetNextSunday (DateTime date) 
{ 
    if (date.DayOfWeek == DayOfWeek.Sunday) 
      date = date.AddDays(1); 
    while (date.DayOfWeek != DayOfWeek.Sunday) 
      date = date.AddDays(1); 

    return date; 
} 
+0

Dodajesz 1 dzień bez względu na bieżący dzień ... – Joey

+0

Dodaję 1 dzień, jeśli jest on obecnie w niedzielę (zakładam, że jeśli jest niedziela, OP chce w następną niedzielę), to po prostu dodawaj dni, aż będzie Niedziela. Następnie wróć tego dnia. Chyba że czegoś brakuje. – MattW