2009-07-17 2 views
16

Je suis sûr que c'est très facile, mais j'ai un blocage mental soudain.
J'essaie d'obtenir un objet DateTime pour l'occurrence suivante de 3h du matin. Par exemple, si DateTime.Now est 16/july/2009 : 12:04pm - la prochaine occurence de trois heures serait 17/july/2009 : 03:00DateTime du prochain événement de 3h

Cependant, si DateTime.Now était 17/july/2009 : 01:00 alors la prochaine occurence serait encore 17/july/2009 : 03:00 (pas le lendemain).
Est-ce que cela a du sens?

Répondre

28

Une option:

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

autre:

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

Beaucoup de façons de dépecer ce chat particulier :)

C'est dans locale temps bien sûr, ce qui signifie vous n'avez pas besoin de vous soucier des fuseaux horaires. La vie devient plus délicat si vous voulez obtenir des fuseaux horaires impliqués ...

Notez que c'est une bonne idée de prendre DateTime.Nowune fois pour éviter des problèmes si la date roule pendant que vous calculez ...

+7

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

+0

Definetely je déteste cette façon de faire une ligne si, et les expressions lambda ... vraiment pas développeur sympathique à lire: /. Cependant, cela fonctionne très bien. –

+1

Bon point à propos de prendre 'Now' une fois et de le réutiliser. J'ai fait cette erreur hier dans une réponse, et Eric Lippert m'a appelé pour ça! – LukeH

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

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

une autre solution (en utilisant une fonction):

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

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

appeler comme:

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

Vous pouvez le faire sans instruction if (ou opérateur conditionnel):

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

J'explique toujours que vous devriez obtenir le point dans le temps (DateTime.Now) qu'une seule fois dans un calcul comme celui-ci, comme il est une valeur changeante, alors dois-je le répéter? Eh bien, je viens de le faire. ;)

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: bonne réflexion, bien qu'elle échoue si c'est exactement 3h00 du matin (bien que cela soit discutable si cela devrait revenir le lendemain ou pas) –

0

Je pense que celui-ci:

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