从 C# 中的 2 个 datetimepicker 计算 days/time(h:m:s)

Calculate days/time(h:m:s) from 2 datetimepicker in C#

我有一个带有按钮、文本框和 2 个日期时间选择器的 windows 表单, 日期时间选择器已自定义显示日期和时间,

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

编辑:

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

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

此代码已经有效,但它在末尾显示额外的随机数。

我也有这个代码来自定义日期时间选择器以显示日期和时间,但它不显示 "AM/PM"

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

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

TIA,我也继续上网寻找答案。

我已经尝试用实际的 DateTimePicker 控件重新创建你的场景,因为代码本身应该可以工作(正如其他人提到的,不需要使用刻度,但它的工作原理是一样的)。

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

MM/dd/yyyy HH:mm:ss

由于您从控件中以 "Text" 的形式访问该值,并且您的 OS 在不是默认 DateTime 格式的文化中可能是 运行,因此转换时出现异常可能发生。

例如如果您尝试转换 5/13/2017 - 2017 年 5 月 13 日,但您的 OS 默认文化期望此日期的格式为 13/5/2017 - 可能会发生 String was not recognized as a valid DateTime 异常。当您输入日期 5 月 10 日和 5 月 11 日时,该代码还会 return 不正确的持续时间,因为程序会将这些日期解释为 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"); 

this code already works, but it displays additional random numbers at the end.

TimeSpanToString returns 使用通用格式说明符 ("c") 格式化的结果,即 [-][d.]hh:mm:ss[.fffffff]

fffffff 是(来自 here

The optional fractional portion of a second. Its value can range from "0000001" (one tick, or one ten-millionth of a second) to "9999999" (9,999,999 ten-millionths of a second, or one second less one tick).

您可以检查 here 以获得 TimeSpan 的自定义格式。

如果您只需要天数、小时数、分钟数和秒数,您将使用:

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

如果您仍在使用比 .net 4 更旧的框架,您将不会发现 ToString 的重载。

那你可以做的是:

string result = string.Format("{0}.{1}:{2}:{3}",
    duration.Days,
    duration.Hours,
    duration.Minutes,
    duration.Seconds)