2009-07-17 10 views
16

Sono sicuro che è molto semplice, ma ho un blocco mentale improvviso.
Sto cercando di ottenere un oggetto DateTime per la prossima occorrenza delle 3:00. Per esempio, se è DateTime.Now16/july/2009 : 12:04pm - la prossima occorrenza di 03:00 sarebbe 17/july/2009 : 03:00DateTime della prossima occorrenza 3am

Tuttavia, se DateTime.Now era 17/july/2009 : 01:00 poi la prossima occorrenza sarebbe ancora 17/july/2009 : 03:00 (non il giorno dopo).
Ha senso?

risposta

28

Una possibilità:

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

altro:

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

Un sacco di modi di scuoiare quel particolare gatto :)

Questo è tutto in locali tempo, naturalmente, il che significa non devi preoccuparti dei fusi orari. La vita diventa più complicato se si vuole ottenere fusi orari coinvolti ...

Si noti che è una buona idea di prendere DateTime.Nowvolta per evitare problemi se la data rotola, mentre si sta calcolando ...

+7

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

+0

Sicuramente io odio questo modo di fare un inline se, e le espressioni lambda ... davvero non sviluppato amichevole da leggere: /. Tuttavia questo funziona bene. –

+1

Buon punto sul prendere 'Now' una volta e riutilizzarlo. Ho fatto quell'errore ieri in una risposta, ed Eric Lippert mi ha chiamato per questo! – LukeH

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

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

un'alternativa (utilizzando una funzione):

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

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

chiamare in:

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

si può fare senza un if (o operatore condizionale):

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

ho sempre spiegare che si dovrebbe ottenere il punto nel tempo (DateTime.Now) solo una volta in un calcolo di questo tipo, come è un valore che cambia, quindi devo ripeterlo? Bene, l'ho appena fatto. ;)

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: buona idea, anche se fallisce se sono esattamente le 3:00 del mattino (anche se è discutibile se questo dovesse tornare il giorno dopo o no) –

0

Penso che questo:

DateTime.Now.Date.AddHours(3).AddMinutes(0).AddSeconds(0).AddDays(1); 
Problemi correlati