解析字符串输入C#

时间:2015-04-23 09:34:29

标签: c# parsing formatting

假设我有一个绑定到控制台输入的字符串,并且必须包含以下任何格式的日期数据:

"dd/mm/yyyy"
"dd.mm.yyyy"
"dd,mm,yyyy"

将此字符串解析为DateTime对象的最安全的方法是什么?我应该使用Regex方法还是简单地使用所有可能上面提到的输入格式迭代String.Format()方法,直到它成功解析?

5 个答案:

答案 0 :(得分:3)

DateTime.ParseExact确实有一个可以提供多种格式的重载

  

将指定的日期和时间字符串表示形式转换为它   DateTime等效使用指定的格式数组,   文化特定的格式信息和风格。格式   字符串表示必须至少匹配一种指定的格式   完全或抛出异常。

CultureInfo.InvariantCulture传递给IFormatProvider应正确处理. , /

的分隔符
var dateformats = new[] { "dd/mm/yyyy", "dd.mm.yyyy", "dd,mm,yyyy" };

DateTime.ParseExact("23/04/2015", dateformats, CultureInfo.InvariantCulture, DateTimeStyles.None);
DateTime.ParseExact("23.04.2015", dateformats, CultureInfo.InvariantCulture, DateTimeStyles.None);
DateTime.ParseExact("23,04,2015", dateformats, CultureInfo.InvariantCulture, DateTimeStyles.None);

答案 1 :(得分:2)

您需要使用DateTime.TryParseExact,因为有多种格式不会产生任何异常

  

将指定的日期和时间字符串表示形式转换为它   DateTime等效。字符串表示的格式必须   完全匹配指定的格式。该方法返回一个值   表示转换是否成功。

答案 2 :(得分:1)

DateTime.ParseExact方法

  

将指定的日期和时间字符串表示形式转换为它   DateTime等效。

DateTime.TryParseExact方法

  

将指定的日期和时间字符串表示形式转换为   它的DateTime等价物。字符串表示的格式必须   完全匹配指定的格式。该方法返回一个值   表示转换是否成功。

注意:

  

Parse将区域设置(当前线程的文化)纳入   帐户。因此,您需要明确指定正确的格式   具有不变的文化,例如。的en-US

答案 3 :(得分:1)

使用DateTime.ParseExact或DateTime.TryParseExact是不够的。 /是一个特殊的格式字符,即日期分隔符。在格式字符串中,它将替换为应用程序当前文化的日期分隔符。它无法转义,因为\之类的特殊字符。如果您的系统文化使用.(俄罗斯和其他国家/地区),这将导致问题。

要指定其他日期分隔符,您需要使用所需的分隔符创建CultureInfo对象。以下函数接受分隔符列表,并尝试使用每个分隔符解析日期,直到其中一个成功:

public static bool TryParseDate(string input, string[] separators, out DateTime date)
{
    var ci = (CultureInfo) CultureInfo.InvariantCulture.Clone();

    foreach (var separator in separators)
    {
        ci.DateTimeFormat.DateSeparator = separator;
        DateTime result;
        if (DateTime.TryParseExact(input, "dd/MM/yyyy", ci, DateTimeStyles.None, 
                                   out date))
            return true;
    }
    date=new DateTime();
    return false;
}

无需定义多种格式,因为dd/MM/yyyy符合所有情况。

这允许您编写类似以下代码段的代码:

var separators = new []{"/",".",",","-"};
DateTime result;
var success1 = TryParseDate("12.05.2015", separators, out result);
var success2 = TryParseDate("12/05/2015", separators, out result);
var success3 = TryParseDate("12,05,2015", separators, out result);
var success4 = TryParseDate("12-05-2015", separators, out result);

我添加了-,因为我发现它在德国是一个常见的分隔符。您可以将格式作为另一个参数传递,从而使该功能更加通用。

TryParseExact接受多种格式参数。如果不是/分隔符,您可以使用所有格式编写一个调用:

var formats=new []{"dd.MM.yyyy","dd,MM,yyyy","dd-MM-yyyy"};
DateTime result;
var success=DateTime.TryParseExact(input, formats, 
                       CultureInfo.InvariantCulture, DateTimeStyles.None, 
                       out date)

答案 4 :(得分:-1)

我认为只是迭代String.Format,它可能比使用正则表达式更容易。但是如果你有实际的用户输入到你有DateTimes的地方,一个正则表达式更安全,但它应该仍然被尝试使其防止崩溃。