Промежуток времени между сейчас и следующим часом? - PullRequest
9 голосов
/ 20 апреля 2011

Сейчас 8:30, и я пытаюсь выяснить, сколько секунд осталось между настоящим и следующим целым часом (9:00).Я думаю, что я просто хочу DateTime.Now.AddHours(1), но после этого я думаю, что мне нужен "пол".Как получить это значение?

Спасибо.

Ответы [ 11 ]

19 голосов
/ 20 апреля 2011

Вокруг времени суток в часах до следующего интегрального значения:

var timeOfDay = DateTime.Now.TimeOfDay;
var nextFullHour = TimeSpan.FromHours(Math.Ceiling(timeOfDay.TotalHours));
var delta = (nextFullHour - timeOfDay).TotalSeconds;
5 голосов
/ 20 апреля 2011

// Совершенно неправильно прочитано. Полностью переписываю

Я просто сделаю что-нибудь подобное

int minutesToNextHour = 60 - DateTime.Now.Minutes;
int secondsToNextHour = minutesToNextHour * 60;
4 голосов
/ 20 апреля 2011

Это, кажется, самое простое:

3600 - DateTime.Now.TimeOfDay.TotalSeconds % 3600

(если вы хотите, чтобы оно было целыми числами - целыми числами, - тогда префикс DateTime.Now... с (int).

3 голосов
/ 20 апреля 2011

Вам не нужно возиться с потолками и полами.Свойство DateTime.Hour представляет целых часов (это целое число от 0 до 23) времени дня, представленного DateTime.Вы можете использовать это и свойство DateTime.Date, чтобы убрать ненужные компоненты DateTime (данные за час), а затем просто вычесть по мере необходимости, чтобы получить TimeSpan.

var now = DateTime.Now;
var timeToNextHour = now.Date.AddHours(now.Hour + 1) - now;

Конечно, вы можете извлечь TotalSeconds компонент из полученного TimeSpan, если вы хотите получить результат в секундах.

1 голос
/ 20 апреля 2011
TimeSpan result =  (new DateTime(DateTime.Now.Year, DateTime.Now.Millisecond, 
DateTime.Now.Day, DateTime.Now.Hour + 1, 0, 0)).Subtract(DateTime.Now);

По сути, здесь вы строите новый DateTime, который начинается через час, без минут или секунд, затем вы вычитаете из этого значение Now и получаете свой результат.

1 голос
/ 20 апреля 2011
TimeSpan sec = new TimeSpan(0, 0, 3600 - (DateTime.Now.Minute * 60));
1 голос
/ 20 апреля 2011

Как насчет этого:

 var currentTime = DateTime.Now;
 var hour = currentTime.AddHours(1).Hour;
 var newTime = Convert.ToDateTime(hour + ":00");
 var timespan = newTime.Subtract(currentTime);
 var secondsDiff = timespan.TotalSeconds;
1 голос
/ 20 апреля 2011

Как насчет:

var now = DateTime.Now;
int secondsTillNextHour = (60 - now.Minute)*60+(60-now.Second);

Или (может быть, яснее):

int SecondsTillNextHour = 3600 - 60*now.Minute - now.Second;
1 голос
/ 20 апреля 2011

Так что вам нужно вычесть «оставшиеся» минуты, найти разницу и умножить ее на 60, верно?

0 голосов
/ 27 апреля 2011

Более читаемая версия:

public double SecondsToNextHour()
{
  return SecondsToNextHour( DateTime.Now );
}

public double SecondsToNextHour( DateTime moment )
{
  DateTime currentHour = new DateTime( moment.Year, moment.Month, moment.Day, moment.Hour, 0, 0 );
  DateTime nextHour = currentHour.AddHours( 1 );
  TimeSpan duration = nextHour - moment;
  return duration.TotalSeconds;
}
...