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

And*_*son 8 c# datetime string-parsing

我希望能够解析的串时间,其中运行小时从0到23(小时,分,秒),并且其中用于一个位数小时前述零是任选的.

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

  • 212540
  • 061525
  • 94505

我试图使用C#方法DateTime.ParseExact来管理解析,但我不能在它的生命周期中提出一个格式字符串,可以处理"没有前置零的单位数小时"场景.

我应该如何指定DateTime.ParseExact格式字符串以使用相同的代码行充分解析上面的所有示例?

自定义日期和时间格式MSDN页面的启发,我尝试了以下方法:

DateTime.ParseExact(time_string, "Hmmss", CultureInfo.InvariantCulture);
DateTime.ParseExact(time_string, "%Hmmss", CultureInfo.InvariantCulture);
DateTime.ParseExact(time_string, "HHmmss", CultureInfo.InvariantCulture);
Run Code Online (Sandbox Code Playgroud)

所有这些格式字符串都适用于上面的前两个示例情况,但面对一位数小时而没有前面的零,所有公式都会抛出一个FormatException.

Ale*_*nov 5

您可以在小时、分钟和秒之间插入分隔符,如下所示:

string timeString = "94505";
string formatedTimeString = Regex.Replace(str, @"\d{1,2}(?=(\d{2})+$)", "$&:");
var datetime = DateTime.ParseExact(formatedTimeString, "H:mm:ss", CultureInfo.InvariantCulture);
Run Code Online (Sandbox Code Playgroud)

更新: 我在解析格式字符串时找到了失败的原因"94505""Hmmss"

发生的情况是 H、m 和 s 实际上会在可能的情况下抓取两位数,即使格式的其余部分没有足够的位数。因此,例如格式为 Hmm 和数字 123 的情况下,H 将抓取 12 并且只剩下 3 个。而 mm 需要两位数,所以失败了。

所以基本上你有两个选项来处理“没有前面零的个位数小时”场景:

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

  2. 像我之前建议的那样或像keyboardP那样修改字符串。


key*_*rdP 2

如果您知道始终有六个字符,则可以填充输入字符串。

string input = "94505";
if(input.Length < 6)
   input = input.PadLeft(6, '0');
Run Code Online (Sandbox Code Playgroud)

(或者input.Length == 5如果您有其他更短的有效格式,请使用)。

  • 谢谢,@keyboardP,但是我必须填充时间字符串才能使解析工作似乎有点牵强?毕竟,使用“Hmmss”作为 *输出* 格式说明符效果非常好,例如 `new DateTime(2013, 9, 24, 7, 0, 0).ToString("Hmmss")` 将输出“70000”。我仍然希望有人能想出“神奇”的格式字符串:-) (2认同)