为什么DateTime.ParseExact不能解析DateTime输出?

Gre*_*kin 13 .net c# datetime

在努力解决DateTime.ParseExact格式化问题时,我决定从DateTime.ToString()向ParseExact提供输出,如下所示:

DateTime date2 = new DateTime(1962, 1, 27);
string[] expectedFormats = { "G", "g", "f", "F", "D", "d", "M/d/yyy", "MM/dd/yyy", "MM-dd-yyy", "MMM dd, yyy", "MMM dd yyy", "MMMM dd, yyy", "MMMM dd yyy" };
bool parsed = false;

foreach (string fmt in expectedFormats)
{
    try
    {
        DateTime dtDateTime = DateTime.ParseExact(date2.ToString(fmt), fmt, new CultureInfo("en-US"));
        parsed = true;
    }
    catch (Exception)
    {
        parsed = false;
    }

    Console.WriteLine("[{0}] {1}", parsed,date2.ToString(fmt));
}
Run Code Online (Sandbox Code Playgroud)

这是输出:

[True] 1/27/1962 12:00:00 AM
[True] 1/27/1962 12:00 AM
[True] Saturday, January 27, 1962 12:00 AM
[True] Saturday, January 27, 1962 12:00:00 AM
[True] Saturday, January 27, 1962
[True] 1/27/1962
[False] 1/27/1962
[False] 01/27/1962
[False] 01-27-1962
[False] Jan 27, 1962
[False] Jan 27 1962
[False] January 27, 1962
[False] January 27 1962
Run Code Online (Sandbox Code Playgroud)

我必须做什么才能使ParseExact解析自定义格式字符串?我错误地期望DateTime能够基于相同的格式字符串摄取它自己的输出吗?

Bri*_*eon 11

这清楚地表明,DateTime.ParseExact不是往返安全的Datetime.ToString.我不确定这是一个很好的答案,但问题肯定与3位数年份格式有关yyy.自1962年以来不能用3位数ToString表示强制使用4位数.显然ParseExact不够聪明,无法扭转这种逻辑,而是寻找正好3位数.解决方法是使用yyyy而不是yyy.我会将此作为错误提交给Microsoft Connect网站,看看它是什么来的.