2009-07-17 16 views
16

Jestem pewien, że to bardzo proste, ale mam nagłą blokadę mentalną.
Próbuję uzyskać obiekt DateTime na następny występ o 3 nad ranem. Na przykład, jeśli DateTime.Now jest 16/july/2009 : 12:04pm - następny tego wystąpienia 3am będzie 17/july/2009 : 03:00DateTime następnego 3am wystąpienia

Jeśli jednak DateTime.Now był 17/july/2009 : 01:00 a następny występowanie będzie nadal 17/july/2009 : 03:00 (a nie dzień później).
Czy to ma sens?

Odpowiedz

28

Jedną z opcji:

DateTime now = DateTime.Now; 
DateTime today3am = now.Date.AddHours(3); 
DateTime next3am = now <= today3am ? today3am : today3am.AddDays(1); 

Inna:

DateTime now = DateTime.Now; 
DateTime today = now.Date; 
DateTime next3am = today.AddHours(3).AddDays(now.Hour >= 3 ? 1 : 0) 

Wiele sposobów skórowania tego konkretnego kota :)

To wszystko w lokalnej czasie kursu, co oznacza, nie musisz martwić się o strefy czasowe. Życie staje się trudniejsze, jeśli chcesz uzyskać stref czasowych zaangażowany ...

Należy pamiętać, że jest to dobry pomysł, aby wziąć DateTime.Nowraz aby uniknąć problemów jeśli data przewraca gdy jesteś obliczania ...

+7

'DateTime today3am = DateTime.Today.AddHours (3);' – Blixt

+0

Definetely nienawidzę ten sposób zrobić inline wtedy i wyrażenia lambda ... naprawdę nie jest przyjazny dla czytelnika: /. Jednak działa to dobrze. –

+1

Dobrze jest zabrać 'Now' raz i ponownie go użyć. Popełniłem ten błąd wczoraj w odpowiedzi, a Eric Lippert wezwał mnie do tego! – LukeH

5
DateTime now = DateTime.Now; 
DateTime threeAM = now.Date.AddHours(3); 

if (threeAM < now) 
    threeAM = threeAM.AddDays(1); 
1

alternatywny (przy użyciu funkcji)

DateTime NextAt(TimeSpan time) 
{ 
    DateTime now = DateTime.Now; 
    DateTime result = now.Date + time; 

    return (now <= result) ? result : result.AddDays(1); 
} 

połączenia go jak:

DateTime next3am = NextAt(new TimeSpan(3,0,0)); 
1

Można to zrobić bez if (lub operator warunkowy):

// get the current time 
DateTime now = DateTime.Now; 
// get a 3:00 AM point in time in the future 
DateTime next = now.Date.AddHours(24 + 3); 
// subtract the number of whole extra days 
next = next.AddDays((now - next).Days); 

zawsze wyjaśnić, że powinieneś dostać punktu w czasie (DateTime.Now) tylko raz w obliczeniach jak to, jak to zmieniająca się wartość, więc czy muszę to powtarzać? Po prostu to zrobiłem. ;)

2
//just add 24 - 3 = 21 hours and get Today (start of day) and Add 3 hour 

DateTime now = DateTime.Now.AddHours(21).Today.AddHours(3); 
+0

+1: dobre myślenie, chociaż nie powiedzie się, jeśli jest dokładnie o 3:00 (chociaż jest dyskusyjne, czy powinno to nastąpić następnego dnia, czy nie) –

0

Myślę, że ten pierwszy:

DateTime.Now.Date.AddHours(3).AddMinutes(0).AddSeconds(0).AddDays(1); 
Powiązane problemy