parse - datetime year c#
Fecha y hora de la próxima ocurrencia a las 3am (6)
Estoy seguro de que esto es muy fácil, pero tengo un bloqueo mental repentino.
Estoy tratando de obtener un objeto DateTime para la próxima aparición de las 3am. Por ejemplo, si DateTime.Now
es 16/july/2009 : 12:04pm
- la próxima ocurrencia de las 3am sería el 17/july/2009 : 03:00
Sin embargo, si DateTime.Now
fuera el 17/july/2009 : 01:00
, la próxima aparición sería el 17/july/2009 : 03:00
(no el día siguiente).
¿Tiene sentido?
Creo que este:
DateTime.Now.Date.AddHours(3).AddMinutes(0).AddSeconds(0).AddDays(1);
Puede hacerlo sin una sentencia if (u operador condicional):
// 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);
Siempre le explico que debe obtener el punto en el tiempo (DateTime.Now) solo una vez en un cálculo como este, ya que es un valor cambiante, ¿tengo que repetirlo? Bueno, acabo de hacerlo. ;)
Una alternativa (utilizando una función):
DateTime NextAt(TimeSpan time)
{
DateTime now = DateTime.Now;
DateTime result = now.Date + time;
return (now <= result) ? result : result.AddDays(1);
}
llámalo como
DateTime next3am = NextAt(new TimeSpan(3,0,0));
Una opción:
DateTime now = DateTime.Now;
DateTime today3am = now.Date.AddHours(3);
DateTime next3am = now <= today3am ? today3am : today3am.AddDays(1);
Otro:
DateTime now = DateTime.Now;
DateTime today = now.Date;
DateTime next3am = today.AddHours(3).AddDays(now.Hour >= 3 ? 1 : 0)
Muchas maneras de desollar a ese gato en particular :)
Por supuesto, todo esto está en la hora local , lo que significa que no debe preocuparse por las zonas horarias. La vida se vuelve más complicada si quieres involucrar zonas horarias ...
Tenga en cuenta que es una buena idea tomar DateTime.Now
una vez, para evitar problemas si la fecha se desplaza mientras calcula ...
//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);
DateTime now = DateTime.Now;
DateTime threeAM = now.Date.AddHours(3);
if (threeAM < now)
threeAM = threeAM.AddDays(1);