找到两个DateTimes(小时和分钟)之间的差异

时间:2016-01-20 06:42:06

标签: c# datetime timespan

我试图创建一个简单的程序,读取用户输入的时间以及他们醒来的时间,并输出他们睡觉的总时间。输出显示不正确,我不确定问题是什么。我尝试了两种不同的代码,但它们似乎都遇到了同样的问题。

第一个代码是:

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成为输出的原因是什么?如何解决?

3 个答案:

答案 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;