2013-11-21 50 views
1

我似乎無法得到自定義格式適合我TimeSpan.ParseExact()解析確切的自定義時間格式?

時間樣本可以預料:

1:23:45.6 
23:45.6 
23:45 
1:23:45 

字符串格式我使用的是:

string withTenthFormat = @"[%h\:]mm\:ss[\.%f]"; 

嘗試可選擇幾小時和幾分之一秒。但是,使用此格式和CultureInfo.InvariantCulture確實會導致FormatException。我錯過了什麼?

回答

8

我不知道能否在自定義格式字符串中指定可選部件。我建議你使用多種格式的字符串,並使用帶有一系列格式的TimeSpan.ParseExact的重載。

string[] formats = { @"h\:mm\:ss\.FFF", @"mm\:ss\.FFF", 
        @"h\:mm\:ss", @"mm\:ss"}; 
string[] values = { "1:23:45.6", "23:45.6", "23:45", "1:23:45" }; 

foreach (string value in values) 
{ 
    var parsed = TimeSpan.ParseExact(value, formats, 
            CultureInfo.InvariantCulture); 
    Console.WriteLine(parsed); 
} 

(我使用FFF爲毫秒符,讓你表達「1:23:45.67」,以及如果你只曾經要幾百毫秒,Ff將被罰款。 )

1

我會簡單地使用DateTime.ParseExact,而不是因爲它的功能更強大:

string[] strings = new[] { "1:23:45.6", "23:45.6", "23:45", "1:23:45" }; 
string[] formats = new[] { "H:mm:ss.f", "H:mm.f", "H:mm", "H:mm:ss" }; 
TimeSpan[] timespans = strings 
    .Select(str => 
    { 
     TimeSpan? ts = null; 
     DateTime dt; 
     if (DateTime.TryParseExact(str, formats, CultureInfo.InvariantCulture, DateTimeStyles.None, out dt)) 
      ts = dt.TimeOfDay; 
     return ts; 
    }) 
    .Where(ts => ts.HasValue) 
    .Select(ts => ts.Value) 
    .ToArray(); 

Demonstration

+1

但是它並沒有解析你想要解析的東西 - 當你確定你總是處理你實際感興趣的類型時,日期和時間處理就更加簡單了'TimeSpan.ParseExact'可以在這裏工作很好。 –

+0

採取了點。然而,我保持答案顯示,你也可以用'DateTime.ParseExact'解析'TimeSpan's,它支持更多的格式,[更容易使用](http://stackoverflow.com/a/12731600/284240)並且在.NET 4以下也可用。 –

+1

只要您想解析小於24小時的值,當然。如果你想允許日子變得更加棘手。我同意,.NET中的TimeSpan解析比實際應該更挑剔。 –