.Net DateTime.ParseExact不工作

时间:2016-03-01 14:34:56

标签: c# .net datetime

应该进行以下解析,

DateTime.ParseExact("20150105 91353", "yyyyMMdd Hmmss", CultureInfo.InvariantCulture);;

我发现上面的方法不起作用,而下面的方法有效,

DateTime.ParseExact("20150105 091353", "yyyyMMdd HHmmss", CultureInfo.InvariantCulture);;

我想知道第一行代码有什么问题。

2 个答案:

答案 0 :(得分:1)

根据MSDN

  

如果不在自定义格式模式中使用日期或时间分隔符,请使用provider参数的不变区域性和每个自定义格式说明符的最宽格式。例如,如果要在模式中指定小时数,请指定更宽的形式“HH”,而不是更窄的形式“H”。

这意味着这是正确的DateTime.ParseExact("20150105 9:13:53", "yyyyMMdd H:mm:ss", CultureInfo.InvariantCulture);因为它正在使用时间分隔符

答案 1 :(得分:1)

这是Custom DateTime格式可能导致输入不明确的特殊情况之一。

如果在小时和分钟之间没有分隔符,则单H格式无法区分第二个数字属于小时或分钟,因此您的解析失败。

91353 //interpreted either as 9 13 53 or 91 35 3 - which one? ambiguous -> error

但这没关系:

string str = "20150105 9:13:53"; //no ambiguity with format yyyyMMdd H:mm:ss
string fmt = "yyyyMMdd H:mm:ss"; //can handle both "20150105 9:13:53" and "20150105 09:13:53"
DateTime dt = DateTime.ParseExact(str, fmt, CultureInfo.InvariantCulture);

要解决此问题,请尝试对原始string进行一些操作。

string dtstr = "20150105 91353";
string fmt = "yyyyMMdd Hmmss";
string[] parts = dtstr.Split(' ');
string str = parts[1].Length < 6 ? string.Join(" 0", parts) : dtstr;
DateTime dt = DateTime.ParseExact(str, fmt, CultureInfo.InvariantCulture);

然后应该没问题。