Сложная проблема алгоритма DateTime - PullRequest
1 голос
/ 20 апреля 2011

.NET дает мне текущее время как в местном, так и в часовом поясе UTC (или любом другом) в структуре DateTime.

Учитывая только переменные часа / минуты, найдите, когда произойдет следующее вхождение этого периода времени (например, 6:30 PM / AM), с возможностью извлекать больше будущих времен по желанию.

Звучит просто, но, действительно, друзья, это уже давно ломает мою лапшу.

Редактировать:

Пример:

~-------|now|------??-----------|future known time|------------~
~-------2pm------??2-----------9am------------~
??2 = 19

Ответы [ 3 ]

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

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

    //this is your target time from 1 to 12 h
    var future = new TimeSpan(11, 30, 0);

    //TimeOfDay gives you the time elapsed since midnight as a TimeSpan
    var difference = future.Subtract(DateTime.Now.TimeOfDay);

    //check for negative TimeSpan, 
    //it means the target time occurs on the next day, just add 24 hours
    if (difference < TimeSpan.Zero)
        difference = difference.Add(TimeSpan.FromDays(1));

Теперь у вас есть TimeSpan, который представляет то, что вам нужно.Вы можете использовать его свойства, чтобы выразить его так, как вам удобно.Например:

    difference.TotalHours; //(double) total time as a fractional hour
    difference.Hours;      //(int) just the hour component of the total time

Что касается получения большего количества будущих времен (утра и вечера), вы можете просто добавить еще 12 часов к difference для получения следующего события.

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

Не уверен, что я полностью понял ваши требования, но, кажется, вы ищете что-то подобное?

public class TimeIterator
{
    public DateTime CurrDateTime { get; set; }

    public IEnumerable<DateTime> GetTimes(short count)
    {
        for (short i = 1; i <= count; i++)
            yield return this.CurrDateTime.AddHours(i * 12);            
    }

    public TimeIterator()
    {
        this.CurrDateTime = DateTime.Now;
    }
}

Этот код можно легко настроить для работы с любым временным интервалом - не только с 12-часовым интервалом

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

Это было закодировано в форме stackoverflow, так что, вероятно, есть некоторые опечатки.В любом случае, вы получите большую картину.

public DateTime search(int hour, int min) {
  if (hour >= 12)
    return partialSearch(hour - 12, hour, min);

  else
    return partialSearch(hour, hour + 12, min);
}

public DateTime partialSearch(int morningHour, int afternoonHour, int min) {
  DateTime now = DateTime.now;

  if (now.hour == morningHour || now.hour == afternoonHour) {
    if (now.minutes <= min) {
      return now.AddMinutes(min - now.minutes);
    }
    now = now.AddHour(1);
  }

  now = now.AddMinutes(-now.Minutes); // set the minutes to 0
  while(now.hour != morningHour || now.hour != afternoonHour) {
    now = now.AddHour(1);
  }

  return now.addMinutes(min);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...