下一个凌晨3点发生的日期时间
我确信这很容易,但我有一个突然的精神障碍。
我正在尝试为下一次出现的凌晨3点获取一个DateTime对象。 例如,如果DateTime.Now
是16/july/2009 : 12:04pm
– 下一次出现的凌晨3 16/july/2009 : 12:04pm
是17/july/2009 : 03:00
但是,如果DateTime.Now
是17/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);