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

时间:2009-07-17 11:06:22

标签: c# datetime

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

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

6 个答案:

答案 0 :(得分:29)

一个选项:

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)

给那只特殊猫咪涂上很多皮肤的方法:)

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

请注意,最好在{/ 1}} 一次,以避免在计算时日期翻转时出现问题......

答案 1 :(得分:5)

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

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

答案 2 :(得分:3)

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

答案 3 :(得分:1)

另一种选择(使用功能):

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

答案 4 :(得分:1)

您可以在没有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),因为它是一个变化的值,所以我必须重复它吗?好吧,我刚刚做了。 ;)

答案 5 :(得分:0)

我认为这一个:

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