DateTime следующего 3-кратного появления
Я уверен, что это очень легко, но у меня внезапный ментальный блок.
Я пытаюсь получить объект DateTime для следующего появления 3am. Например, если DateTime.Now
- 16/july/2009 : 12:04pm
- следующая ошибка 3am будет 17/july/2009 : 03:00
Однако, если DateTime.Now
было 17/july/2009 : 01:00
, тогда следующее появление все равно будет 17/july/2009 : 03:00
(а не на следующий день).
Это имеет смысл?
Ответы
Ответ 1
Один вариант:
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
один раз, чтобы избежать проблем, если дата свертывается во время вычисления...
Ответ 2
DateTime now = DateTime.Now;
DateTime threeAM = now.Date.AddHours(3);
if (threeAM < now)
threeAM = threeAM.AddDays(1);
Ответ 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);
Ответ 4
Альтернатива (с использованием функции):
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));
Ответ 5
Вы можете сделать это без инструкции 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) только один раз в расчете, как это, так как он меняет значение, поэтому я должен его повторять? Ну, я просто это сделал.;)
Ответ 6
Я думаю, что это одно:
DateTime.Now.Date.AddHours(3).AddMinutes(0).AddSeconds(0).AddDays(1);