C# - TimeSpan超过一天不能使用秒

时间:2013-09-09 13:53:12

标签: c# timespan

我认为这个问题的标题并不好,但我找不到更好的标题。

我要做的是让用户能够设置倒计时器。 (见图1): enter image description here

应用程序接受用户输入并检查用户选择的时间单位,然后将其转换为秒,并将值分配给 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小时的状态。我做错了什么?

(问题):

enter image description here

6 个答案:

答案 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部分。您想使用TotalHoursdouble显示以小时为单位的全部金额;例如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)

还有“天”组件,您根本无法显示。