C#不和谐机器人的时间减法
我正在制作一个有趣的discord机器人,它可以在时钟上找到下一个4:20,无论是上午还是下午,并告诉您离4:20还有多长时间。我的代码在4:20前一个小时都能正常工作,然后它会跳到前面,告诉你到下一个4:20还有多长时间,而不是显示“0小时59分钟”。我在想我如何格式化时间输出可能会有问题,但我对C#非常陌生,不知道如何修复它。我已经包括了我的代码和当前输出的屏幕截图。在屏幕截图中,机器人也休息了一分钟,但从那时起,我就想出了如何解决这个问题。我知道代码不是最有效或最干净的,但我对编程非常陌生C#不和谐机器人的时间减法,c#,datetime,time,subtraction,discord.net,C#,Datetime,Time,Subtraction,Discord.net,我正在制作一个有趣的discord机器人,它可以在时钟上找到下一个4:20,无论是上午还是下午,并告诉您离4:20还有多长时间。我的代码在4:20前一个小时都能正常工作,然后它会跳到前面,告诉你到下一个4:20还有多长时间,而不是显示“0小时59分钟”。我在想我如何格式化时间输出可能会有问题,但我对C#非常陌生,不知道如何修复它。我已经包括了我的代码和当前输出的屏幕截图。在屏幕截图中,机器人也休息了一分钟,但从那时起,我就想出了如何解决这个问题。我知道代码不是最有效或最干净的,但我对编程非常陌生
//查找时钟上的下一个4:20
[命令(“420”)]
公共异步任务WeedMinute()
{
DateTime currentTime=DateTime.Now;//当前时间
DateTime weedMinuteMorning=Convert.ToDateTime(“4:21:00”);//4:20am
DateTime WeedMinuteEventing=Convert.ToDateTime(“16:21:00”);//4:20pm
字符串weedMinutePM=“16:21:00”;//这些变量用于减法
字符串weedMinuteAM=“4:21:00”;
如果(currentTime=weedMinuteMorning)
{
//ChooseMorning黄昏是输出时间字符串
DateTime ChooseMorningNight=(DateTime.Parse(weedMinuteAM).Subtract(currentTime.TimeOfDay));
wait Context.Channel.SendMessageAsync(“下一分钟将发生在”+choosMorningNight.ToString(@“hh”)+“小时”+choosMorningNight.ToString(@“mm”)+“分钟”);
}
}
这里有一个DateTime.Compare函数,可用于修复错误,如下所示
//DateTime currentTime = DateTime.Now; //Current time
DateTime currentTime = Convert.ToDateTime("3:22:00"); // An example time for 0 hours and 59 mins
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.CompareTo(weedMinuteMorning) < 1) //less than or same as Morning 4:20 am
{
var chooseMorningEvening = weedMinuteMorning - currentTime;
string m = "The next weed minute will happen in " + chooseMorningEvening.Hours + " hours " + chooseMorningEvening.Minutes + " minutes.";
}
else
{
var chooseMorningEvening = weedMinuteEvening - currentTime;
string m = "The next weed minute will happen in " + chooseMorningEvening.Hours + " hours " + chooseMorningEvening.Minutes + " minutes.";
}
//DateTime currentTime=DateTime.Now//当前时间
DateTime currentTime=Convert.ToDateTime(“3:22:00”);//0小时59分钟的示例时间
DateTime weedMinuteMorning=Convert.ToDateTime(“4:21:00”)//上午4:20
DateTime WeedMinuteEventing=转换为ToDateTime(“16:21:00”)//下午4:20
字符串weedMinutePM=“16:21:00”//这些变量用于减法
字符串weedMinuteAM=“4:21:00”;
如果(currentTime.CompareTo(weedMinuteMorning)<1)//小于或等于上午4:20
{
var chooseMorningNight=weedMinuteMorning-currentTime;
string m=“下一分钟将发生在”+选择晨晚。小时数+“小时数”+选择晨晚。分钟数+“分钟数。”;
}
其他的
{
var ChooseMorningNighlight=weedMinuteEvening-currentTime;
string m=“下一分钟将发生在”+选择晨晚。小时数+“小时数”+选择晨晚。分钟数+“分钟数。”;
}
您的时间输出格式似乎还可以,只是要获得更好的格式,请参阅
您的代码有三个问题:1.如果条件
if (currentTime <= weedMinuteEvening)
{
//this condition is true from 00:00:00 to 16:21:01 so for dates less than 4:21:00
//you get incorrect output, and next condition execute just for dates greater than 16:21:00.
...
}
else if (currentTime >= weedMinuteMorning)
{
//This code execute only for dates greater than 16:21:00.
...
}
您的代码的问题在于它不能处理所有可能发生的情况(有三种情况):
- 时间在00:00:00和04:20:00之间=>计算时间到04:20:00
- 时间介于04:20:00和16:20:00之间=>计算时间到16:20:00
- 时间在16:20:00之后=>计算时间到第二天04:20:00
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;
}
您可以减少其中的行数,但使用这些临时变量会使调试更容易。您可以在使用调试器进行调试时检查currentTime
是否符合预期,以及timeToWeed
是否有意义,依此类推
将代码分成两个函数也有许多优点:
- 您可以独立于bot测试时间计算
- 代码更加清晰,您没有将通信代码与计算代码混淆
希望这能有所帮助。我认为从currentTime中删除TimeOfDay就足够了
[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
//I removed These variables, Don't need to parse same DateTime again. change it as you wish
//string weedMinutePM = "16:21:00";
//string weedMinuteAM = "4:21:00";
if (currentTime <= weedMinuteMorning)
{
TimeSpan timeSpan = weedMinuteMorning.Subtract(currentTime);
await Context.Channel.SendMessageAsync("The next weed minute will happen in " + timeSpan.ToString("hh' hours 'mm' minutes.'"));
}
else if (currentTime <= weedMinuteEvening)
{
TimeSpan timeSpan = weedMinuteEvening.Subtract(currentTime);
await Context.Channel.SendMessageAsync("The next weed minute will happen in " + timeSpan.ToString("hh' hours 'mm' minutes.'"));
}
else
{
//To handle dates greater than 16:21:00, we must calculate hours
//remaining until 4:20 next day.
weedMinuteMorning = weedMinuteMorning.AddDays(1);
TimeSpan timeSpan = weedMinuteMorning.Subtract(currentTime);
await Context.Channel.SendMessageAsync("The next weed minute will happen in " + timeSpan.ToString("hh' hours 'mm' minutes.'"));
}
}
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;
}
[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);
}