2017-08-29 57 views
1

我用下面的時間字符串解析到一個時間跨度:解析AM/PM時間字符串時間跨度

string[] formats = { "hhmm", "hmm", @"hh\:mm", @"h\:mm\:ss", @"h\:mm", "hh:mm tt" }; 

parseSuccess = TimeSpan.TryParseExact(value, formats, CultureInfo.CurrentCulture, TimeSpanStyles.None, out dtValue); 

這將返回false當我試圖解析像上午9:00的值,5 :00 PM。這裏有什麼問題?

+0

解析我會考慮「9:00 AM」一個**點**及時,而不是時間**跨度**。順便說一句,那是什麼編程語言? C#? – qqilihq

+0

是的,對不起,這是C# – devC

+1

@qqilihq:這個問題來自'DateTime.TimeOfDay'在.NET返回'TimeSpan'。內置的日期/時間API是有點問題,國際海事組織... –

回答

5

tt不存在作爲格式說明custom TimeSpan format strings之一。這使得在TimeSpan感覺真的意味着是一個持續時間,沒有時間的日值 - 這是不幸的,DateTime.TimeOfDay確實返回TimeSpan

這可能是最簡單的解析值作爲DateTime然後得到一天的從時間:我已經糾正了hh:mm tth:mm tt爲您的樣本數據

string text = "5:00 PM"; 
string[] formats = { "hhmm", "hmm", @"hh\:mm", @"h\:mm\:ss", @"h:mm", @"h:mm tt" }; 

var success = DateTime.TryParseExact(text, formats, CultureInfo.CurrentCulture, 
    DateTimeStyles.None, out var value); 
Console.WriteLine(value.TimeOfDay); 

注意不0-填充。您很可能希望HHmm,並HH:mm代替hhmmhh:mm爲好,接受如「21:00」的價值觀。

另外,使用對時間的日特定類型的我Noda Time庫(LocalTime),可直接與LocalTimePattern :)

+0

這幾乎適用於所有我的時間格式,但我看到一個奇怪的問題,PM時間格式失敗。例如,下午2點或下午5點接受4:00 AM失敗。 – devC

+1

@devC與我提供的* exact *代碼?請注意,對於接受'tt'的格式,您需要'h'而不是'H'。根據我的示例代碼,它應該沒問題。 –

+0

我明白了。我的格式數組中仍然有H。謝謝你! – devC