DateTime.ParseExact,包含7位数字/一个月或两位数月份

Tim*_*ter 12 .net c# datetime parsing

到现在为止,我认为我会理解DateTime.ParseExact它是如何工作的,但这令人困惑.为什么以下行返回false

DateTime.TryParseExact("2013122", "yyyyMdd", CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None, out lastUpdate)
Run Code Online (Sandbox Code Playgroud)

月份也可以有两位数.在我看来,它应该能够理解它意味着2013年1月22日.为什么我走错了路?我错过了什么或者有一个简单的解决方法吗?


同时我正在使用这种不太优雅的解决方法,但有效:

public static DateTime? ParseDate_yyyyMdd(String date)
{
    if (date == null)
        return null;
    date = date.Trim();
    if (date.Length < 7)
        return null;
    if (date.Length == 7)
        date = date.Insert(4, "0");
    DateTime dt;
    if (DateTime.TryParseExact(date, "yyyyMMdd", CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None, out dt))
        return dt;
    return null;
}
Run Code Online (Sandbox Code Playgroud)

给出了我想要的结果:

DateTime? date = ParseDate_yyyyMdd("2013122");
Console.Write(date.ToString()); // 01/22/2013
Run Code Online (Sandbox Code Playgroud)

但是,我仍然对这种限制的原因感兴趣.也许有人也有更好的方法.

fli*_*art 6

MSDN文档:

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

我认为原因是它试图从左到右解析(没有回溯).因为没有分隔符,所以无法确定日期部分的边界.

  • 你试过这样转换吗?它仍然为`yyyyMMdd`返回false (2认同)