查找两个 DateTimes 之间的差异(小时和分钟)
Finding the difference between two DateTimes (hours and minutes)
我正在尝试创建一个简单的程序,读取用户输入的入睡时间和醒来时间,并输出他们的总睡眠时间。输出显示不正确,我不确定问题出在哪里。我尝试了两种不同的代码,但它们似乎都遇到了同样的问题。
第一个代码是这样的:
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 AM 用于唤醒时间。输出是 8 小时,这是正确的。我尝试将 sleepTime 的值更改为 11:00 PM,wakeTime 的值更改为 7:00 AM,输出为 -16:00,这是不正确的,因为 11:00 PM 和 7:00 AM也是8小时
这是我尝试使用的第二个代码:
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,我该如何解决?
如果wakeTime < sleepTime 那么wakeTime 显然是第二天。然后您需要添加另一天:
if (sleepDuration.TotalHours < 0)
sleepDuration += TimeSpan.FromDays(1);
这里的问题是只解析带有 DateTime.Parse
的时间会将日期部分默认为 DateTime.Today
。
如果您输入您在 23:00 睡觉并在 07:00 醒来,这些值将如下所示(今天我写这个答案时):
2016-01-20 23:00
2016-01-20 07:00
请注意,这是同一天。 DateTime.Parse
不知道您在其中解析值的上下文,也不应该知道。
基本上你"slept in reverse".
你应该这样处理:
if (wakeTime < sleepTime)
wakeTime = wakeTime.AddDays(1);
这将正确表示您第二天早上醒来的事实,然后减法将正确地 return 8 小时。
仅使用日期解析日期时间时出现的问题
您必须提供日期才能获得确切的解决方案
其他
TimeSpan sleepDuration=null;
if(wakeTime> sleepTime)
sleepDuration= wakeTime - sleepTime;
else
sleepDuration= sleepTime-wakeTime;
我正在尝试创建一个简单的程序,读取用户输入的入睡时间和醒来时间,并输出他们的总睡眠时间。输出显示不正确,我不确定问题出在哪里。我尝试了两种不同的代码,但它们似乎都遇到了同样的问题。
第一个代码是这样的:
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 AM 用于唤醒时间。输出是 8 小时,这是正确的。我尝试将 sleepTime 的值更改为 11:00 PM,wakeTime 的值更改为 7:00 AM,输出为 -16:00,这是不正确的,因为 11:00 PM 和 7:00 AM也是8小时
这是我尝试使用的第二个代码:
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,我该如何解决?
如果wakeTime < sleepTime 那么wakeTime 显然是第二天。然后您需要添加另一天:
if (sleepDuration.TotalHours < 0)
sleepDuration += TimeSpan.FromDays(1);
这里的问题是只解析带有 DateTime.Parse
的时间会将日期部分默认为 DateTime.Today
。
如果您输入您在 23:00 睡觉并在 07:00 醒来,这些值将如下所示(今天我写这个答案时):
2016-01-20 23:00
2016-01-20 07:00
请注意,这是同一天。 DateTime.Parse
不知道您在其中解析值的上下文,也不应该知道。
基本上你"slept in reverse".
你应该这样处理:
if (wakeTime < sleepTime)
wakeTime = wakeTime.AddDays(1);
这将正确表示您第二天早上醒来的事实,然后减法将正确地 return 8 小时。
仅使用日期解析日期时间时出现的问题 您必须提供日期才能获得确切的解决方案 其他
TimeSpan sleepDuration=null;
if(wakeTime> sleepTime)
sleepDuration= wakeTime - sleepTime;
else
sleepDuration= sleepTime-wakeTime;