如何将MMMdyyyyhhmmtt格式的日期时间字符串转换为datetime对象?

我尝试过如下:

DateTime.ParseExact("Feb520161000PM", "MMMdyyyyhhmmtt", CultureInfo.InvariantCulture) 

但是它给出了FormatException

有趣的是

 DateTime.ParseExact(DateTime.Now.ToString("MMMdyyyyhhmmtt"), "MMMdyyyyhhmmtt", CultureInfo.InvariantCulture) 

这也是格式exception。

阿列克谢的回答是对的,如果你让我,我想解释一下……

你认为5应该与d说明符匹配,对吗? 但这不是DateTime.ParseExact 在引擎盖下工作的方式 。

由于"d"自定义格式说明符表示从131 ,因此该说明符将在字符串中映射52不仅仅是5 。 这就是你的代码抛出FormatException的原因。

正如您所看到的, 除非您使用它进行一些字符串操作, 否则无法解析您的字符串格式。

在这种情况下,.NET Team 建议使用两个数字forms(如05或插入分隔符作为日期和时间值。

您可以创建一个解析此MMMdyyyyhhmmtt格式的自定义方法, 用于解析此类格式化的字符串;

 public static DateTime? ParseDate_MMMdyyyyhhmmtt(string date) { if (date == null) return null; if (date.Length < 14) return null; if (date.Length == 14) date = date.Insert(3, "0"); DateTime dt; if (DateTime.TryParseExact(date, "MMMdyyyyhhmmtt", CultureInfo.InvariantCulture, DateTimeStyles.None, out dt)) return dt; return null; } 

使用从左到右工作的常规解析格式是不可解析的 – 您需要自定义代码从右到左解析值,而不是您想要最左边的数字是可变宽度(“Feb111111111PM”)。

如果可能 – 将格式更改为具有固定宽度字段的格式(最好是ISO8601)。 否则手动拆分字符串并从结果部分构造日期(时间部分本身可以正常工作,因此只需要手动解析日期部分)。

其他一些方法和信息可以在关于时间的类似post中找到 – DateTime.ParseExact – 如何使用相同的格式字符串解析单位和双位小时?