从C中的2个datetimepicker计算天数/时间(h:m:s)

时间:2017-05-11 06:05:42

标签: c# visual-studio-2015 datetimepicker

我有一个带有按钮,文本框和2个datetimepicker的窗体, datetimepicker已自定义为显示日期和时间,

我想要的是计算2 datetimepicker之间的差异,单击按钮,输出将显示在文本框上,输出应显示天,小时,分钟,秒的差异,如果差异不是更多超过1天,那么输出应该是小时,分钟,秒。

编辑:

 DateTime startTime = dateTimePicker2.value;
 DateTime endTime = dateTimePicker3.value;

 TimeSpan duration = new TimeSpan(endTime.Ticks - startTime.Ticks);

此代码已经有效,但最后会显示其他随机数。

我也有这个代码来自定义datetimepicker以显示日期和时间,但它不显示“AM / PM”

dateTimePicker2.Format = DateTimePickerFormat.Custom;
dateTimePicker2.CustomFormat = "MM/dd/yyyy hh:mm:ss";

这里是否缺少代码,这就是AM / PM没有出现的原因?

TIA,我还继续冲浪以寻找答案。

2 个答案:

答案 0 :(得分:1)

我试图用实际的DateTimePicker控件重新创建你的场景,因为代码本身应该可以工作(正如其他人提到的那样,不需要使用ticks,但它的工作原理完全相同)。

但我注意到的是您使用的时间格式,即:

MM/dd/yyyy HH:mm:ss

由于您从控件访问值为“Text”,并且您的操作系统可能正在运行在不是默认DateTime格式的Culture上,因此可能会发生转换异常。

E.g。如果您尝试转换2017年5月13日 - 2017年5月13日,但您的操作系统默认文化期望此日期的格式为13/5/2017 - 可能会发生String was not recognized as a valid DateTime异常。当您输入日期5月10日和5月11日时,代码也会返回不正确的持续时间,因为程序会将这些日期解释为10月5日和11月5日。

为避免这种情况,您可以使用datepicker.Value从控件中取回DateTime,从而无需转换。

所以代码看起来像这样(显示到文本框):

DateTime startTime = dateTimePicker1.Value;
DateTime endTime = dateTimePicker2.Value;

TimeSpan duration = new TimeSpan(endTime.Ticks - startTime.Ticks);

textBox1.Text = duration.ToString(@"dd\.hh\:mm\:ss"); 

答案 1 :(得分:1)

  

此代码已经有效,但最后会显示其他随机数。

ToString的{​​{1}}返回使用通用格式说明符(" c")格式化的结果TimeSpan

[-][d.]hh:mm:ss[.fffffff]是(来自here

  

一秒的可选小数部分。其价值范围为" 0000001" (一个刻度,或一个百万分之一秒)到" 9999999" (9,999,999万分之一秒,或者减少一分之一秒)。

您可以查看here以获取fffffff的自定义格式。

如果您只想要使用的天数,小时数,分钟数和秒数:

TimeSpan

如果您仍在使用比.net 4更旧的框架,则不会发现此duration.ToString(@"dd\.hh\:mm\:ss"); 的重载。

你可以做的是:

ToString