9

我希望能够解析时间字符串(小时、分钟、秒),其中小时从 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);

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

4

3 回答 3

5

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

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"

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

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

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

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

于 2013-09-24T10:59:10.480 回答
2

如果你知道你总是有六个字符,你可以填充你的输入字符串。

string input = "94505";
if(input.Length < 6)
   input = input.PadLeft(6, '0');

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

于 2013-09-24T10:31:23.990 回答
0

如何使用:

DateTime.ParseExact(time_string, "Hmmss", CultureInfo.InvariantCulture).ToString("HH:mm:ss")

于 2015-08-21T16:53:34.823 回答