Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#不和谐机器人的时间减法_C#_Datetime_Time_Subtraction_Discord.net - Fatal编程技术网

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#非常陌生,不知道如何修复它。我已经包括了我的代码和当前输出的屏幕截图。在屏幕截图中,机器人也休息了一分钟,但从那时起,我就想出了如何解决这个问题。我知道代码不是最有效或最干净的,但我对编程非常陌生

我正在制作一个有趣的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
如果你观察到你下次toke的时间应该在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;
    }
您可以减少其中的行数,但使用这些临时变量会使调试更容易。您可以在使用调试器进行调试时检查
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);
    }