2009-07-17 7 views
16

Ich bin sicher, das ist sehr einfach, aber ich habe eine plötzliche mentale Blockade.
Ich versuche, ein DateTime-Objekt für das nächste Vorkommen von 3 Uhr zu bekommen. Zum Beispiel, wenn DateTime.Now ist 16/july/2009 : 12:04pm - die nächsten Vorkommen von 03.00 17/july/2009 : 03:00DateTime der nächsten 3 Uhr Vorkommen

Jedoch wären, wenn DateTime.Now17/july/2009 : 01:00 sind dann würde das nächste Vorkommen noch 17/july/2009 : 03:00 (nicht am Tag nach) sein.
Macht das Sinn?

Antwort

28

Eine Option:

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

Ein anderer:

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

Viele Möglichkeiten, diese besondere Katze Enthäuten :)

Das ist alles in lokalen Zeit natürlich, was bedeutet, Sie müssen sich keine Gedanken über Zeitzonen machen. Das Leben wird schwieriger, wenn Sie Zeitzonen beteiligt erhalten möchten ...

Beachten Sie, dass es eine gute Idee ist, Probleme zu nehmen DateTime.Noweinmal zu vermeiden, wenn das Datum rollt, während Sie die Berechnung ...

+7

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

+0

Definetely ich so hasse ein Inline wenn und die Lambda-Ausdrücke zu tun ... wirklich nicht entwicklerfreundlich zu lesen: /. Das funktioniert jedoch gut. –

+1

Guter Punkt darüber, "Now" einmal zu nehmen und es erneut zu verwenden. Ich habe diesen Fehler gestern in einer Antwort gemacht, und Eric Lippert hat mich dazu aufgefordert! – LukeH

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

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

eine alternative (eine Funktion):

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

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

Anruf es mögen:

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

Sie können es ohne eine tun if-Anweisung (oder Bedingungsoperator):

// 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); 

ich, dass du so in einer Berechnung nur einmal den Zeitpunkt (DateTime.Now) zu bekommen, wie es ist immer erklären sollte ein veränderlicher Wert, muss ich es also wiederholen? Nun, ich habe es gerade getan. ;)

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: gutes Denken, obwohl es scheitert, wenn es genau 3:00 Uhr morgens ist (obwohl es fraglich ist, ob das am nächsten Tag zurückkehren sollte oder nicht) –

0

Ich denke, das One:

DateTime.Now.Date.AddHours(3).AddMinutes(0).AddSeconds(0).AddDays(1); 
Verwandte Themen