我希望能够解析 time (小时,分钟,秒)的字符串,其中小时数从0到23,并且前一个零位数的小数字小时是可选的。< / p>
我希望能够解析为有效DateTime
对象的 time 字符串示例:
我正在尝试使用C#方法DateTime.ParseExact来管理解析,但我不能在它的生命周期中提出一个格式字符串,它可以处理“没有前置零的单位数小时”场景。
我应该如何指定DateTime.ParseExact
格式字符串,以便用相同的代码行充分解析上面的所有示例?
受到MSDN page on custom date and time formats的启发,我尝试了以下方法:
DateTime.ParseExact(time_string, "Hmmss", CultureInfo.InvariantCulture);
DateTime.ParseExact(time_string, "%Hmmss", CultureInfo.InvariantCulture);
DateTime.ParseExact(time_string, "HHmmss", CultureInfo.InvariantCulture);
所有这些格式字符串都适用于上面的前两个示例案例,但面对一位数小时且没有前面的零,所有公式都会抛出FormatException
。
答案 0 :(得分:4)
您可以在小时,分钟和秒之间插入分隔符,如下所示:
string timeString = "94505";
string formatedTimeString = Regex.Replace(str, @"\d{1,2}(?=(\d{2})+$)", "$&:");
var datetime = DateTime.ParseExact(formatedTimeString, "H:mm:ss", CultureInfo.InvariantCulture);
<强>更新强>
在使用格式字符串"94505"
解析"Hmmss"
时,我找到了the cause of failure:
正在发生的事情是H,m和s实际上会抓住两位数字,即使其余格式没有足够的数字。因此,例如格式为Hmm和数字123,H将抓住12并且只剩下3个。 mm需要两位数,所以它失败了。
所以基本上你有两种选择来处理“没有前置零的一位数小时”的情况:
更改时间格式:将小时数放在最后(例如,"ssmmH"
或"mmssH"
)或使用分隔符(例如,"H:mm:ss"
)
像我之前建议的那样修改字符串,或者像keyboardP has一样修改字符串。
答案 1 :(得分:2)
如果您知道自己总是有六个字符,则可以填充输入字符串。
string input = "94505";
if(input.Length < 6)
input = input.PadLeft(6, '0');
(如果您有其他更短的有效格式,请使用input.Length == 5
。
答案 2 :(得分:0)
如何使用:
DateTime.ParseExact(time_string,“Hmmss”,CultureInfo.InvariantCulture).ToString(“HH:mm:ss”)