我试图创建一个简单的程序,读取用户输入的时间以及他们醒来的时间,并输出他们睡觉的总时间。输出显示不正确,我不确定问题是什么。我尝试了两种不同的代码,但它们似乎都遇到了同样的问题。
第一个代码是:
Console.WriteLine("Please input time you slept");
string sleepTime = Console.ReadLine();
Console.WriteLine("Please input the time you woke up");
string wakeTime = Console.ReadLine();
TimeSpan sleepDuration = DateTime.Parse(wakeTime).Subtract(DateTime.Parse(sleepTime));
Console.WriteLine("You slept for " + sleepDuration + " hours");
Console.ReadKey();
我第一次尝试使用12:00 AM睡眠时间,上午8:00使用wakeTime。输出是8小时,这是正确的。我尝试将值更改为睡眠时间的晚上11:00和wakeTime的上午7:00,输出为-16:00,这是不正确的,因为11:00 PM和7:00 AM之间的时间也是8小时。 / p>
这是我尝试使用的第二个代码:
Console.WriteLine("Please input the time you went to sleep");
DateTime sleepTime = Convert.ToDateTime(Console.ReadLine());
Console.WriteLine("Please input the time you woke up");
DateTime wakeTime = Convert.ToDateTime(Console.ReadLine());
TimeSpan sleepDuration = wakeTime - sleepTime;
Console.WriteLine("You slept for " + sleepDuration + " hours");
Console.ReadKey();
我使用了与第一个代码完全相同的时间,得到了完全相同的输出。 12:00 AM至8:00 AM输出8:00和11:00 PM至7:00 AM输出-16:00。
导致-16:00成为输出的原因是什么?如何解决?
答案 0 :(得分:2)
此处的问题是,仅使用DateTime.Parse
解析时间会将日期部分默认为DateTime.Today
。
如果您输入的是您在23:00睡觉并在07:00醒来,这些值将如下所示(今天我写这个答案时):
2016-01-20 23:00
2016-01-20 07:00
注意它是同一天。 DateTime.Parse
不了解您正在解析值的上下文,它不应该。
基本上你“反向睡觉”。
你应该这样处理:
if (wakeTime < sleepTime)
wakeTime = wakeTime.AddDays(1);
这将正确表示您第二天早上醒来的事实,然后减法将正确返回8小时。
答案 1 :(得分:1)
如果wakeTime&lt; sleepTime然后wakeTime显然是第二天。然后,您需要再添加一天:
if (sleepDuration.TotalHours < 0)
sleepDuration += TimeSpan.FromDays(1);
答案 2 :(得分:-1)
使用仅使用日期解析日期时的问题 你必须给出日期以获得确切的解决方案 其他明智的
TimeSpan sleepDuration=null;
if(wakeTime> sleepTime)
sleepDuration= wakeTime - sleepTime;
else
sleepDuration= sleepTime-wakeTime;