我认为这个问题的标题并不好,但我找不到更好的标题。
我要做的是让用户能够设置倒计时器。 (见图1):
应用程序接受用户输入并检查用户选择的时间单位,然后将其转换为秒,并将值分配给 int 变量。
private int seconds = -1;
private void enable_button_Click(object sender, EventArgs e)
{
int amount = Convert.ToInt32(time_numericUpDown.Value);
string unit = tUnits_comboBox.Text;
// Check what time is chosen then convert it to seconds
if (unit == "Seconds")
seconds = amount;
else if (unit == "Minutes")
seconds = amount * 60;
else if (unit == "Hours")
seconds = amount * 3600;
else if (unit == "Days")
seconds = amount * 86400;
// Clock it!
timer.Enabled = true;
}
然后,计时器应以人类可读的格式显示时间,我使用此代码:
private void timer_Tick(object sender, EventArgs e)
{
// Verify if the time didn't pass
if (seconds == 0)
{
// If the time is over, do the specified action
timer.Enabled = false;
operation(); // << This is the function that does the Action!
}
else
{
// Continue counting
seconds -= 1;
TimeSpan timeSpan = TimeSpan.FromSeconds(seconds);
string answer = string.Format("{0:D2}h:{1:D2}m:{2:D2}s",
timeSpan.Hours,
timeSpan.Minutes,
timeSpan.Seconds);
status_label.Text = "Restarting in " + answer;
}
}
当“秒”变量的值代表一天或更少时,这非常有效,但是当它超过24小时时,它只显示24小时的状态。我做错了什么?
(问题):
答案 0 :(得分:3)
如果这是您要显示的最大值,请使用TotalHours
。如果您查看TimeSpan,它在Days属性中也会有一个值。
TimeSpan ts = new TimeSpan(48, 0, 0);
MessageBox.Show(ts.Days.ToString() + " - " + ts.Hours.ToString()); // 2 - 0
MessageBox.Show(ts.TotalHours.ToString()); // 48
请注意,TotalHours是一个表示小时数的双倍:
TimeSpan ts = new TimeSpan(47, 59, 0);
MessageBox.Show(ts.Days.ToString() + " - " + ts.Hours.ToString()); // 1 - 23
MessageBox.Show(ts.TotalHours.ToString()); // 47.98333
因此,为了获得您想要显示的值,您应该将其向下舍入:
TimeSpan ts = new TimeSpan(47, 59, 0);
MessageBox.Show(Math.Floor(ts.TotalHours).ToString()); // 47
答案 1 :(得分:3)
所有不以Total
开头的属性仅包含不适合下一个更高属性的余数。
换句话说:Days
属性将包含值1
。
答案 2 :(得分:2)
如果你看一下list of properties in TimeSpan
,这可能会更有意义。 Hours
属性仅显示“小时”部分,就像您看到56
代表“秒”部分而不是172,796
(2天减去4秒)一样。还有Days
部分。您想使用TotalHours
(double
显示以小时为单位的全部金额;例如47.99995
中的 string answer = string.Format("{0:00}h:{1:D2}m:{2:D2}s",
Math.Floor(timeSpan.TotalHours),
timeSpan.Minutes,
timeSpan.Seconds);
和Math.Floor
:
47:59:56
在您的示例中,这将导致{{1}}。
答案 3 :(得分:1)
TimeSpan timeSpan = TimeSpan.FromSeconds(seconds);
当时间跨度超过24小时时,那将被视为一天。所以你必须以这种方式计算。
示例:
总秒数:93600表示26小时,单位时间表示1天2小时。
希望你明白。
由于
答案 4 :(得分:1)
尝试TotalHours而不是小时。
string answer = string.Format("{0:00}h:{1:D2}m:{2:D2}s",
timeSpan.TotalHours,
timeSpan.Minutes,
timeSpan.Seconds);
答案 5 :(得分:1)
Hours
获取当前TimeSpan结构所代表的时间间隔的小时部分。 (来自msdn)
还有“天”组件,您根本无法显示。