具有自定义格式的DateTime.Parse

时间:2015-01-22 06:33:43

标签: c# .net datetime

我正在尝试使用DateTime.Parse以自定义格式解析包含DateTime的字符串。

格式为yy-MMM MMMM-dddd-ddd-dd,字符串为15-jan. január-szerda-Sze-07

我修改了操作系统区域设置中的ShortDatePattern,您可以在调试时在CultureInfo.CurrentCulture中看到它。

Watch the pattern in debug

我正在使用以下代码:

var date = DateTime.Parse(dateInString, CultureInfo.CurrentCulture);

但它失败,异常String was not recognized as a valid DateTime.

使用ParseExact 可以工作。

var date = DateTime.ParseExact(
    dateInString, 
    CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern,
    CultureInfo.CurrentCulture);

Parse不应该也能正常工作吗?

任何帮助都将不胜感激。


修改

假设Parse不够好,这应该没问题,还是会引起我现在想不到的问题(它适用于上述问题)?

DateTime date = new DateTime();

bool success = false;

foreach (var format in currentCulture.DateTimeFormat.GetAllDateTimePatterns())
{
    success = DateTime.TryParseExact(dateString, format, culture, DateTimeStyles.AllowWhiteSpaces, out date);

    if (success)
        break;
}

if (!success)
    throw new Exception();

1 个答案:

答案 0 :(得分:4)

我用你的例子玩了一点,我无法使它工作。我认为 DateTime.Parse 根本不够聪明,无法解析您的字符串,MSDN文档证实了这一点。以下是ParseExact文档中的一节,根据该文档, Parse 不应与自定义文化/模式一起使用,以及原因:

  

如果解析为自定义区域性生成的日期和时间字符串,请使用ParseExact方法而不是Parse方法来改进   解析操作成功的概率。自定义文化   日期和时间字符串可能很复杂,因此很难   解析。 Parse方法尝试用几个解析一个字符串   隐式解析模式,所有这些都可能失败。

这是来自SetAllDateTimePatterns文档的另一个有趣的片段:

  

在解析日期和时间的字符串表示时,Parse和TryParse方法不会完全迭代模式中的所有字符串。如果   你需要一个日期和时间字符串来具有特定的格式   在解析操作时,您应该将有效格式的数组传递给   DateTime.ParseExact ...