DateTime следующего появления 3am - PullRequest
16 голосов
/ 17 июля 2009

Я уверен, что это очень легко, но у меня внезапный умственный блок.
Я пытаюсь получить объект DateTime для следующего 3:00. Например, если DateTime.Now равно 16/july/2009 : 12:04pm - следующее вхождение в 3 часа ночи будет 17/july/2009 : 03:00

Однако, если DateTime.Now было 17/july/2009 : 01:00, то следующим случаем все равно было бы 17/july/2009 : 03:00 (а не послезавтра).
Имеет ли это смысл?

Ответы [ 6 ]

29 голосов
/ 17 июля 2009

Один вариант:

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)

Множество способов снятия шкуры с этой конкретной кошки :) 1007 *

Все это, конечно, в местном времени, что означает, что вам не нужно беспокоиться о часовых поясах. Жизнь становится сложнее, если вы хотите задействовать часовые пояса ...

Обратите внимание, что это хорошая идея - взять DateTime.Now один раз , чтобы избежать проблем, если дата перевернется во время вычисления ...

5 голосов
/ 17 июля 2009
DateTime now = DateTime.Now;
DateTime threeAM = now.Date.AddHours(3);

if (threeAM < now)
    threeAM = threeAM.AddDays(1);
3 голосов
/ 17 июля 2009
//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);
1 голос
/ 17 июля 2009

Вы можете сделать это без оператора 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) только один раз в таком вычислении, как это, поскольку это изменяющееся значение, так что я должен повторить его? Ну, я только что сделал. ;)

1 голос
/ 17 июля 2009

Альтернатива (с использованием функции):

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));
0 голосов
/ 07 апреля 2015

Я думаю, что это:

DateTime.Now.Date.AddHours(3).AddMinutes(0).AddSeconds(0).AddDays(1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...