时间跨度转换

TimeSpan Conversion

我想将分钟转换为秒,目前我遇到了问题,因为在分钟文本框中键入 1.50 时结果是 90 秒,这是错误的,因为 1.30 = 90 秒

    private void MtoCbutton_Click(object sender, EventArgs e)
    {
        if (minTosecTextBox.Text != "Minutes")
        {
            minutes = Convert.ToDouble(minTosecTextBox.Text);
            TimeSpan span = TimeSpan.FromMinutes(minutes);
            resultSectextBoxtextBox.Text = span.TotalSeconds.ToString();
        }

        else
        {

            MessageBox.Show("Please enter Minutes");
        }

您需要以不同方式处理文本的转换。您正在将“1.50”直接转换为双精度数,即 1.5 和 1 又 1/2 分钟相当于 90 秒。如果你想让用户输入“1.50”,意思是 1 分 50 秒,那么你需要拆分字符串。你可以这样做:

var split = text.Split('.');
int seconds = 0;
if (split.Length > 1)
{
    seconds = int.Parse(split[1]);
}
seconds += TimeSpan.FromMinutes(split[0]).Seconds;

注意 - 如果您不验证文本,则最终可能会失败。您可能应该使用 TryParse 来验证秒数。 Parse 会抛出异常。

要从秒转换为分钟,您只需除以 60.0(您需要小数,否则它将被视为整数)。如果像整数一样对待并且您超过了 30 秒,则 30/60 将等于 0。

也使用double.TryParse方法。现在,如果有人输入 1.50xx,您的应用程序就会崩溃。使用 double.TryParse 方法或使用 try catch 机制或仅允许数字输入。

编辑

这将完成您想要的。我添加了一个标签来显示输出,但您可以将其删除。

double enteredNumber;
if (double.TryParse(minTosecTextBox.Text, out enteredNumber))
{
    // This line will get everything but the decimal so if entered 1.45, it will get 1
    double minutes = Math.Floor(enteredNumber);

    // This line will get the seconds portion from the entered number.
    // If the number is 1.45, it will get .45 then multiply it by 100 to get 45 secs
    var seconds = 100 * (enteredNumber - Math.Floor(enteredNumber));

    // now we multiply minutes by 60 and add the seconds
    var secondsTotal = (minutes * 60 + seconds);

    this.labelSeconds.Text = secondsTotal.ToString();
}

else
{

    MessageBox.Show("Please enter Minutes");
}

编辑 2

进一步说明

您没有将分钟转换为秒,因为如果您当时是 1.5(1 分半钟)就等于 90 秒。这是合乎逻辑且显而易见的。您仅将小数点前的部分视为分钟,小数点后的部分视为秒(1.30 = 1 分钟,30 秒 = 90 秒)。 所以我们只需要将小数点前的部分换算成秒,再加上小数点后的部分即可。

您可能正在寻找类似 TimeSpan.Parse 方法的东西:

var ts = TimeSpan.Parse("00:01:30");

这将产生 90 秒的时间跨度。

还有一个ParseExact方法,它可以让你指定一个格式字符串,这样你就不必每次都指定小时数,甚至可以让你指定一个点作为分隔符:

var ts = TimeSpan.ParseExact("01.30", @"mm\.ss", System.Globalization.CultureInfo.InvariantCulture);

有关格式字符串,请参阅 Custom Date and Time format strings

另请注意,您需要转义每个要按字面解释的字符(因此 . 之前的 \)。

您案例的完整代码:

var ts = TimeSpan.ParseExact(minTosecTextBox.Text, @"mm\.ss", System.Globalization.CultureInfo.InvariantCulture);
resultSectextBoxtextBox.Text = ts.TotalSeconds.ToString();