DateTime.TryParseExact仅在“单向”中工作

时间:2015-05-04 12:51:29

标签: c# datetime date-format

范围:

我一直在尝试开发一个super-tolerant DateTime.Parse例程,因此我决定尝试使用大多数“广泛使用”的格式来更好地理解format masks

问题:

我已经定义了一个特定的格式(String),我将其用作myDate.ToString(format),它可以创造奇迹。问题是,如果我得到相同的字符串(.ToString(format)操作的结果),并将其反馈回DateTime.TryParseExact (...)则失败。

代码/测试:

System.Globalization.CultureInfo provider = System.Globalization.CultureInfo.InvariantCulture;

// Defining Format and Testing it via "DateTime.ToString(format)"
string format = "MM/dd/yyyy HH:mm:ss tt"; 
string dtNow  = DateTime.Now.ToString (format);
Console.WriteLine (dtNow);

// Trying to Parse DateTime on the same Format defined Above
DateTime time;
if (DateTime.TryParseExact (dtNow, format, provider,    System.Globalization.DateTimeStyles.None, out time))
{
    // If TryParseExact Worked
    Console.WriteLine ("Result: " + time.ToString ());  
}
else
{
    // If TryParseExact Failed
    Console.WriteLine ("Failed to Parse Date");
}

输出为:"Failed to Parse Date".

问题:

为什么我可以使用format字符串将某个日期格式化为文本,但我不能使用相同的format将字符串反馈给日期对象?

修改

我已将部分方法添加到this example,我想知道为什么“ParseDate”方法无法返回正确的日期,因为“String”格式正确。

1 个答案:

答案 0 :(得分:5)

由于您使用的DateTime.ToString()方法没有任何IFormatProvider,因此此方法将使用您的CurrentCulture设置。

这就是你

的原因
string dtNow  = DateTime.Now.ToString (format);

可能生成与MM/dd/yyyy HH:mm:ss tt格式不同的字符串表示形式。

有三件事可能导致这个问题;

  • 您的CurrentCulture的{​​{3}}与/
  • 不同
  • 您的CurrentCulture的{​​{3}}与:
  • 不同
  • 您的CurrentCulture字符串不同或为空DateSeparator和/或TimeSeparator

由于您尝试在provider方法上使用InvariantCultureDateTime.TryParseExact)解析字符串,因此也会根据该提供程序生成字符串。

string dtNow  = DateTime.Now.ToString(format, provider);

您告诉CurrentCulture pt-BR,此文化的空字符""AMDesignatorPMDesignator。这就是为什么你的dtNow字符串在其表示部分没有任何AM或PM指示符的原因。

这里有 AMDesignator