假设我有一个绑定到控制台输入的字符串,并且必须包含以下任何格式的日期数据:
"dd/mm/yyyy"
"dd.mm.yyyy"
"dd,mm,yyyy"
将此字符串解析为DateTime
对象的最安全的方法是什么?我应该使用Regex
方法还是简单地使用所有可能上面提到的输入格式迭代String.Format()
方法,直到它成功解析?
答案 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的地方,一个正则表达式更安全,但它应该仍然被尝试使其防止崩溃。