查找两个 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;