下一个凌晨3点发生的日期时间

我确信这很容易,但我有一个突然的精神障碍。
我正在尝试为下一次出现的凌晨3点获取一个DateTime对象。 例如,如果DateTime.Now16/july/2009 : 12:04pm – 下一次出现的凌晨3 16/july/2009 : 12:04pm17/july/2009 : 03:00

但是,如果DateTime.Now17/july/2009 : 01:00那么下一次出现的时间仍然是17/july/2009 : 03:00 (不是后一天)。
那有意义吗?

一种选择:

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

另一个:

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

很多皮肤特殊猫的方式:)

这当然是在当地时间 ,这意味着您不必担心时区。 如果你想要涉及时区,生活变得更加棘手......

请注意,最好采用DateTime.Now 一次,以避免在计算时日期翻转时出现问题...

 DateTime now = DateTime.Now; DateTime threeAM = now.Date.AddHours(3); if (threeAM < now) threeAM = threeAM.AddDays(1); 
 //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 NextAt(TimeSpan time) { DateTime now = DateTime.Now; DateTime result = now.Date + time; return (now <= result) ? result : result.AddDays(1); } 

称之为:

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

您可以在没有if语句(或条件运算符)的情况下执行此操作:

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

我总是解释你应该在这样的计算中得到时间点(DateTime.Now),因为它是一个变化的值,所以我必须重复它吗? 好吧,我刚刚做了。 ;)

我想这一个:

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