C#转换ss,xx中的精确持续时间(mm:ss,xx)

时间:2017-06-04 06:48:12

标签: c# time formatting type-conversion

我的问题是如何在(ss,十分之一秒)转换时间跨度(m:ss,十分之一秒)时修复失败;

问题是输出如果这是完全错误的。

timeInString = "1:09.01";
tmpData.SetTimeDG2((Convert.ToInt32(timeInString[0] * 60) + Convert.ToInt32(timeInString.Substring(2, 2)) + (Convert.ToDouble(timeInString.Substring(5, 2))/ 100)));

输出必须为69,01,但是为2949.01。

3 个答案:

答案 0 :(得分:3)

请勿尝试自行解析时间字符串。请改用TimeSpan

string timeInString = "1:09.01"; 
TimeSpan interval;
TimeSpan.TryParseExact(timeInString, @"m\:ss\.ff", null, out interval);
Console.WriteLine("Seconds {0}", interval.TotalSeconds);

您的代码存在的问题是timeInString[0] * 60正在使用1的char(unicode)值而不是数值。所以你必须先解析char。但是,如果您尝试输入11:04.13之类的字符串,则代码将失败。只是不要费心解析这个问题。它已经在框架中了。不要重新发明轮子。

答案 1 :(得分:1)

将乘法移到括号外:

Convert.ToInt32(timeInString[0]) * 60

原理

"1"的ASCII值为49,这是您的错误的关键,也是无声的失败原因。

您从这段代码开始:

Convert.ToInt32(timeInString[0] * 60)

这将采用单字符字符串timeInString[0]并将其视为ASCII字符以进行乘​​法。也就是说,因为C#看到一个乘法符号,所以它期望可乘法的东西作为操作数。它看到字符串,并认为,“这是一个幕后的数字;让我们把它视为一个。”这相当于说:

Convert.ToInt32(49 * 60)

评估整个表达式,得到(49 * 60)+ 9 + 0.01 = 2949.01。

您需要做的是将* 60移到括号外。

tmpData.SetTimeDG2((Convert.ToInt32(timeInString[0]) * 60 + Convert.ToInt32(timeInString.Substring(2, 2)) + (Convert.ToDouble(timeInString.Substring(5, 2))/ 100)));

答案 2 :(得分:0)

你错过了一小时的时间。

如果不关心小时,那么你必须将零传递给它。流底C#代码:

        var timeInString = "0:1:09.01";
        var timeInTimeSpan = TimeSpan.Parse(timeInString);