如何解析时间大于24的字符串到TimeSpan?

如何在C#中将30:15的字符串解析为TimeSpan? 30:15表示30小时15分钟。

string span = "30:15"; TimeSpan ts = TimeSpan.FromHours( Convert.ToDouble(span.Split(':')[0])). Add(TimeSpan.FromMinutes( Convert.ToDouble((span.Split(':')[1])))); 

这似乎不太优雅。

如果您确定格式始终为“HH:mm”,请尝试以下操作:

 string span = "35:15"; TimeSpan ts = new TimeSpan(int.Parse(span.Split(':')[0]), // hours int.Parse(span.Split(':')[1]), // minutes 0); // seconds 

与卢克的答案类似:

 String span = "123:45"; Int32 colon = span.IndexOf(':'); TimeSpan timeSpan = new TimeSpan(Int32.Parse(span.Substring(0, colon - 1)), Int32.Parse(span.Substring(colon + 1)), 0); 

显然,它假定原始字符串格式正确(由冒号分隔的两个部分组成,并且可解析为整数)。

我使用的是我很久以前设计的一种简单方法,今天刚刚发布到我的博客:

 public static class TimeSpanExtensions { static int[] weights = { 60 * 60 * 1000, 60 * 1000, 1000, 1 }; public static TimeSpan ToTimeSpan(this string s) { string[] parts = s.Split('.', ':'); long ms = 0; for (int i = 0; i < parts.Length && i < weights.Length; i++) ms += Convert.ToInt64(parts[i]) * weights[i]; return TimeSpan.FromMilliseconds(ms); } } 

与以前提供的更简单的解决方案相比,这可以处理更多的情况,但也有其自身的缺点。 我在这里进一步讨论。

现在,如果您使用的是.NET 4,则可以将ToTimeSpan实现缩短为:

 public static TimeSpan ToTimeSpan(this string s) { return TimeSpan.FromMilliseconds(s.Split('.', ':') .Zip(weights, (d, w) => Convert.ToInt64(d) * w).Sum()); } 

如果您不介意使用水平屏幕状态,您甚至可以将其设为单行...

类似于Lukes的回答,代码和改进空间都很大。 但它也处理负片小时数(“-30:15”),所以也许它可以帮助某人。

 public static double GetTotalHours(String s) { bool isNegative = false; if (s.StartsWith("-")) isNegative = true; String[] splitted = s.Split(':'); int hours = GetNumbersAsInt(splitted[0]); int minutes = GetNumbersAsInt(splitted[1]); if (isNegative) { hours = hours * (-1); minutes = minutes * (-1); } TimeSpan t = new TimeSpan(hours, minutes, 0); return t.TotalHours; } public static int GetNumbersAsInt(String input) { String output = String.Empty; Char[] chars = input.ToCharArray(0, input.Length); for (int i = 0; i < chars.Length; i++) { if (Char.IsNumber(chars[i]) == true) output = output + chars[i]; } return int.Parse(output); } 

用法

 double result = GetTotalHours("30:15"); double result2 = GetTotalHours("-30:15"); 

通常,人们会使用TimeSpan.ParseExact ,其中需要特定的格式。 但是,可以指定的唯一小时格式是天数的一部分(请参阅自定义TimeSpan格式字符串 )。

因此,您需要自己完成这项工作:

 string input = "30:24"; var parts = input.Split(':'); var hours = Int32.Parse(parts[0]); var minutes = Int32.Parse(parts[1]); var result = new TimeSpan(hours, minutes, 0); 

(但有一些错误检查。)

时间跨度的三个整数构造函数允许小时> = 24溢出到天数中。