更好的DateTime.Parse那里?

时间:2010-02-12 17:49:17

标签: c# .net datetime

有没有人知道一个库(付费与否)能够处理比DateTime.Parse使用更常见的日期时间格式?能够处理多种语言和缩写数天/月的东西真的很不错。

例如:“2009年9月1日”不适用于Datetime.Parse。

6 个答案:

答案 0 :(得分:4)

过去我使用过以下代码(expectedDateTimeFormats是遵循Custom Date and Time Format Strings规则的字符串):

// Or use custom DateTimeFormatInfo objects
string[] expectedDateTimeFormats = new string[] {
    "customFormat1",
    "customFormat2",
    "customFormatN",
};

// You could offer several overloads here, to accept other DateTimeStyles,
// InvariantCulture, CurrentUICulture, etc. - perhaps even a collection of
// CultureInfo objects to try
public DateTime TryParseDateString(string dateString, CultureInfo culture) {
    try {
        // first, try to parse given the specified culture's formats
        return DateTime.Parse(dateString, culture);
    }
    catch (FormatException) {
        // if that fails, try your custom formats
        return DateTime.ParseExact(dateString, 
                                   expectedDateTimeFormats, 
                                   culture,
                                   DateTimeStyles.None);
    }
}

如果您正在处理非标准缩写(例如您在评论中提到的“2009年9月1日”),则可能需要创建自定义CultureInfoDateTimeFormatInfo并定义它们自己。

我不知道一个非常好的“标准”自定义格式列表(和/或相关的DateTimeFormatInfo定义) - 如果有人能找到一个,他们当然应该得到接受的答案。我无法再访问我的旧团队(无论如何也无法分享它:()。

答案 1 :(得分:2)

我还必须指出存在DateTime.TryParseDateTIme.TryParseExact方法。我认为你需要担心尝试将字符串转换为DateTime或<insert object type here>时出现异常,这是非常严重的。

答案 2 :(得分:1)

要处理多种语言,您可以使用不同的文化调用DateTime.Parse。

DateTime.Parse会处理开箱即用的缩写。

如果您需要处理非标准组合,请致电DateTime.ParseExact

答案 3 :(得分:1)

我无法回答你的问题。如果你没有得到你喜欢的答案,请考虑DateTime.ParseExact。

答案 4 :(得分:1)

要使用非标准缩写解析日期,您需要创建自己的文化。

例如:(已测试)

var culture = new CultureInfo("en-US");
culture.DateTimeFormat.AbbreviatedMonthNames = new string[] { 
    "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec", "" 
};

DateTime.Parse("Sept 1, 2009", culture);

答案 5 :(得分:0)

不知道它是否有任何“更好”的解析器,但您可以查看The Skeet's操作系统项目,Noda Time