Проблема с вашим кодом заключается в том, что он не обрабатывает все случаи, которые могут возникнуть (их три):
- время между 00:00:00 и 04:20:00 = > рассчитать время до 04: 20: 00
- время между 04:20:00 и 16:20:00 => рассчитать время до 16: 20: 00
- время после 16: 20:00 => рассчитать время до 04:20:00 следующего дня.
Вы можете немного упростить эту задачу, если заметите, что время до следующей раздачи всегда должно быть от 0 до 12 часов. , Итак, если вы просто потратите время до 16:20, если оно больше 12 часов, то вы должны быть до 04:20 и вычесть 12 часов. Если время меньше 0 (то есть отрицательно), то вы должны быть позже 16:20, поэтому вы просто добавляете 12 часов. В коде это выглядит так:
public static TimeSpan CalculateTimeToWeed(DateTime from)
{
DateTime weedTime = Convert.ToDateTime("16:20:00");
TimeSpan twelveHours = TimeSpan.FromHours(12.0);
TimeSpan timeToWeed = weedTime - from;
double totalHours = timeToWeed.TotalHours;
if (totalHours > 12.0)
{
timeToWeed -= twelveHours;
}
else if (totalHours < 0.0)
{
timeToWeed += twelveHours;
}
return timeToWeed;
}
, и вы интегрируете его в своего бота Discord следующим образом:
[Command("420")]
public async Task WeedMinute()
{
DateTime currentTime = DateTime.Now;
TimeSpan timeToWeed = CalculateTimeToWeed(currentTime);
string message = "The next weed minute will happen in " + timeToWeed.ToString("hh' hours 'mm' minutes.'");
await Context.Channel.SendMessageAsync(message);
}
Вы можете сократить количество строк в этом, но имея эти временные переменные упрощают отладку. Вы можете проверить во время работы с отладчиком, что currentTime
- это то, что вы ожидаете, а timeToWeed
имеет смысл и т. Д.
Разделение кода на две функции также имеет ряд преимуществ:
- Вы можете проверить расчет времени независимо от бота
- Код намного понятнее, вы не путаете код связи с кодом расчета.
Надеюсь, это поможет .