DateTime.ParseExact - 如何使用相同的格式字符串解析单位和双位小时?

时间:2013-09-24 10:26:30

标签: c# datetime string-parsing

我希望能够解析 time (小时,分钟,秒)的字符串,其中小时数从0到23,并且前一个零位数的小数字小时是可选的。< / p>

我希望能够解析为有效DateTime对象的 time 字符串示例:

  • 212540
  • 061525
  • 94505

我正在尝试使用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

3 个答案:

答案 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需要两位数,所以它失败了。

所以基本上你有两种选择来处理“没有前置零的一位数小时”的情况:

  1. 更改时间格式:将小时数放在最后(例如,"ssmmH""mmssH")或使用分隔符(例如,"H:mm:ss"

  2. 像我之前建议的那样修改字符串,或者像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”)