我有一个带有按钮,文本框和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,我还继续冲浪以寻找答案。
答案 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