如何将MMMdyyyyhhmmtt格式的日期时间字符串转换为datetime对象?
我尝试过如下:
DateTime.ParseExact("Feb520161000PM", "MMMdyyyyhhmmtt", CultureInfo.InvariantCulture)
但是它给出了FormatException
。
有趣的是
DateTime.ParseExact(DateTime.Now.ToString("MMMdyyyyhhmmtt"), "MMMdyyyyhhmmtt", CultureInfo.InvariantCulture)
这也是格式exception。
阿列克谢的回答是对的,如果你让我,我想解释一下……
你认为5
应该与d
说明符匹配,对吗? 但这不是DateTime.ParseExact
在引擎盖下工作的方式 。
由于"d"
自定义格式说明符表示从1
到31
,因此该说明符将在字符串中映射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 – 如何使用相同的格式字符串解析单位和双位小时?