我有两个文本框。一个用于时钟,一个用于时钟输出。时间将采用以下格式:
Hours:Minutes
让我们说我已经在早上7点钟进入,并在下午2点钟出发。
使用我当前的代码,我得到2小时的差异,但它应该是7小时。我怎么会在C#中做到这一点。我打算转换到24小时,让用户选择上午或下午,但我感到困惑。
所以,基本上,我如何计算两次之间的小时数差异?
我尝试了这个,但是当我插入数字时,却得了2个小时而不是7个小时。
DateTime startTime = Convert.ToDateTime(textBox1.Text);
DateTime endtime = Convert.ToDateTime(textBox2.Text);
TimeSpan duration = startTime - endtime;
答案 0 :(得分:80)
string startTime = "7:00 AM";
string endTime = "2:00 PM";
TimeSpan duration = DateTime.Parse(endTime).Subtract(DateTime.Parse(startTime));
Console.WriteLine(duration);
Console.ReadKey();
将输出:07:00:00。
如果用户输入军事时间,它也有效:
string startTime = "7:00";
string endTime = "14:00";
TimeSpan duration = DateTime.Parse(endTime).Subtract(DateTime.Parse(startTime));
Console.WriteLine(duration);
Console.ReadKey();
输出:07:00:00。
更改格式: duration.ToString(@"hh\:mm")
更多信息: http://msdn.microsoft.com/en-us/library/ee372287.aspx
<强>附录:强>
多年来,我有点困扰我,这是我给过的最受欢迎的答案;原始答案从未真正解释为什么OP的代码不起作用,尽管它 完全有效。得到这么多选票的唯一原因是因为当人们搜索“C#”,“timespan”和“between”这两个术语的组合时,Google就会发布帖子。
答案 1 :(得分:10)
您可以使用TimeSpan构造函数,这对Ticks来说需要很长时间:
TimeSpan duration = new TimeSpan(endtime.Ticks - startTime.Ticks);
答案 2 :(得分:4)
两点:
检查您的输入。我无法想象你通过减去你所谈论的时间值得到2小时的情况。如果我这样做:
DateTime startTime = Convert.ToDateTime("7:00 AM");
DateTime endtime = Convert.ToDateTime("2:00 PM");
TimeSpan duration = startTime - endtime;
...我得到-07:00:00
作为结果。即使我忘记提供AM / PM值:
DateTime startTime = Convert.ToDateTime("7:00");
DateTime endtime = Convert.ToDateTime("2:00");
TimeSpan duration = startTime - endtime;
......我得到05:00:00
。因此,要么您的输入不包含您列出的值,要么您处于机器环境中,它们会以意外的方式开始解析。或者您实际上并未获得报告的结果。
要查找开始时间和结束时间之间的差异,您需要执行endTime - startTime
,而不是相反。
答案 3 :(得分:0)
另一种方式(更长)在VB.net [说2300开始和0700完成第二天]
如果tsStart&gt; tsFinish然后
' Take Hours difference and adjust accordingly
tsDifference = New TimeSpan((24 - tsStart.Hours) + tsFinish.Hours, 0, 0)
' Add Minutes to Difference
tsDifference = tsDifference.Add(New TimeSpan(0, Math.Abs(tsStart.Minutes - tsFinish.Minutes), 0))
' Add Seonds to Difference
tsDifference = tsDifference.Add(New TimeSpan(0, 0, Math.Abs(tsStart.Seconds - tsFinish.Seconds)))