2017-08-29 41 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