我正在使用DateTime.TryParse
来解析从Chatbot捕获的出生日期。由于Chatbot的会话特性,用户可以以各种格式输入他们的DOB,例如“jun 5 1980”或“3/21/1974”。从这个意义上说,DateTime.TryParse
是完美的,因为它可以解析这些和其他格式。
但是,如果您提供部分日期,例如“10/24”或“1977年6月”,则TryParse
将成功,并且缺少日期组件将被默认。对于DOB,这并不理想,因为我们不想接受不完整的日期。有没有办法防止这种违约,并告诉解析器只能成功解析定义日,月和年三个日期的日期?
答案 0 :(得分:3)
您可以将TryParseExact用于多种格式。列出你想要的每种格式可能会有点乏味,但这样你就可以明确它了。
以下代码是使用两种格式的简单,人为的示例。我使用的是美国文化,但您可以根据需要替换自己的文化(或不变的文化)。
DateTime dt;
var str = "6/5/2007";
if (DateTime.TryParseExact(str, "MM/DD/YYYY", new CultureInfo("en-US"), DateTimeStyles.None, out dt)
|| DateTime.TryParseExact(str, "MM/DD/YY", new CultureInfo("en-US"), DateTimeStyles.None, out dt))
{
}
OR
您可以使用DateTime.TryParseExact
的第二个重载。以下代码等同于第一个代码示例:
DateTime dt;
var str = "6/5/2007";
if (DateTime.TryParseExact(str, new[] { "MM/DD/YYYY", "MM/DD/YY" }, new CultureInfo("en-US"), DateTimeStyles.None, out dt))
{
}
答案 1 :(得分:2)
你试过TryParseExact吗? https://msdn.microsoft.com/en-us/library/h9b85w22(v=vs.110).aspx
唯一的缺点是列出您期望的所有格式......
答案 2 :(得分:0)
另一种仅使用TryParse
的方法:将输入字符串与您获得的输出进行比较。基本上,您检查输入字符串是否包含在当前文化中可用于生日的所有格式中
例如:
string myDateOK = "01/12/17";
DateTime.TryParse(myDateOK, CultureInfo.CurrentCulture, DateTimeStyles.None, out DateTime myDateAsDate1);
var isFullDate_myDateAsDate1 = false;
string myDateKO = "12/17";
DateTime.TryParse(myDateKO, CultureInfo.CurrentCulture, DateTimeStyles.None, out DateTime myDateAsDate2);
var isFullDate_myDateAsDate2 = false;
if (myDateAsDate1.Date.GetDateTimeFormats(CultureInfo.CurrentCulture).Contains(myDateOK))
{
isFullDate_myDateAsDate1 = true;
}
if (myDateAsDate2.Date.GetDateTimeFormats(CultureInfo.CurrentCulture).Contains(myDateKO))
{
isFullDate_myDateAsDate2 = true;
}
// => isFullDate_myDateAsDate1 = true and isFullDate_myDateAsDate2 = false
答案 3 :(得分:0)
您可以使用TryParseExact()
和扩展方法的组合。只需列出您希望用户在列表中输入日期的所有格式,然后在列表中调用TryParseExact()
,直到找到匹配为止。
public static class DateTimeExtensions
{
public static bool StrictTryParse(this string s, out DateTime result)
{
result = DateTime.MinValue;
// List all the formats you want here.
// Could move this out of the method, or make it a parameter.
List<string> formats = new List<string> { "MM/dd/yyyy", "MM/dd/yy" };
foreach (string format in formats)
{
if (DateTime.TryParseExact(s, format, CultureInfo.CurrentCulture, DateTimeStyles.None, out result))
return true;
}
return false;
}
}
通过这种方式,您可以使用与StrictTryParse()
相同的方式调用扩展方法TryParse()
,但具有您需要的功能。
string dateStr = "08/23/2017";
DateTime dt;
if (dateStr.StrictTryParse(out dt))
Console.WriteLine("Date: {0}.", dt.ToLongDateString());