gpt4 book ai didi

使用 Discord 机器人进行 C# 时间减法

转载 作者:行者123 更新时间:2023-12-04 04:12:53 25 4
gpt4 key购买 nike

我正在制作一个有趣的 discord 机器人,它可以在时钟上找到下一个 4:20,无论是上午还是下午,并告诉您距离 4:20 还有多长时间。我的代码一直运行到 4:20 之前的一个小时,然后它会跳过并告诉下一个 4:20 之前还有多长时间,而不是显示“0 小时 59 分钟”。我在想我格式化时间输出的方式可能存在问题,但我对 C# 很陌生,不知道如何修复它。我已经包含了我的代码以及当前输出的屏幕截图。在屏幕截图中,机器人也有一分钟的时间,但从那时起我就想出了如何解决这个问题。我知道代码不是最高效或最干净的,但我还是编程新手。

screenshot of bot output

//Finds next 4:20 on the clock
[Command("420")]
public async Task WeedMinute()
{
DateTime currentTime = DateTime.Now; //Current time
DateTime weedMinuteMorning = Convert.ToDateTime("4:21:00"); //4:20am
DateTime weedMinuteEvening = Convert.ToDateTime("16:21:00"); //4:20pm

string weedMinutePM = "16:21:00"; //These variables are used in subtraction
string weedMinuteAM = "4:21:00";


if (currentTime <= weedMinuteEvening)
{
//chooseMorningEvening is the output time string
DateTime chooseMorningEvening = (DateTime.Parse(weedMinutePM).Subtract(currentTime.TimeOfDay));

await Context.Channel.SendMessageAsync("The next weed minute will happen in " + chooseMorningEvening.ToString(@"hh") + " hours " + chooseMorningEvening.ToString(@"mm") + " minutes.");
}
else if (currentTime >= weedMinuteMorning)
{
//chooseMorningEvening is the output time string
DateTime chooseMorningEvening = (DateTime.Parse(weedMinuteAM).Subtract(currentTime.TimeOfDay));

await Context.Channel.SendMessageAsync("The next weed minute will happen in " + chooseMorningEvening.ToString(@"hh") + " hours " + chooseMorningEvening.ToString(@"mm") + " minutes.");
}
}

最佳答案

您的代码的问题是它没有处理所有可能发生的情况(共有三种):

  • 时间在 00:00:00 和 04:20:00 之间 => 计算时间为 04:20:00
  • 时间在 04:20:00 和 16:20:00 之间 => 计算到 16:20:00 的时间
  • 时间在 16:20:00 之后 => 计算时间为第二天 04:20:00。

如果您观察到下一次 token 的时间应始终在 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 是否有意义等等。

将代码分成两个函数也有很多优点:

  • 您可以独立于机器人测试时间计算
  • 代码更清晰,您没有混淆通信代码和计算代码。

希望这对您有所帮助。

关于使用 Discord 机器人进行 C# 时间减法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61416640/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com