可以使C#DateTime.TryParse需要一天,一个月和一年吗?

时间:2017-08-23 19:38:19

标签: c# datetime

我正在使用DateTime.TryParse来解析从Chatbot捕获的出生日期。由于Chatbot的会话特性,用户可以以各种格式输入他们的DOB,例如“jun 5 1980”或“3/21/1974”。从这个意义上说,DateTime.TryParse是完美的,因为它可以解析这些和其他格式。

但是,如果您提供部分日期,例如“10/24”或“1977年6月”,则TryParse将成功,并且缺少日期组件将被默认。对于DOB,这并不理想,因为我们不想接受不完整的日期。有没有办法防止这种违约,并告诉解析器只能成功解析定义日,月和年三个日期的日期?

4 个答案:

答案 0 :(得分:3)

您可以将TryParseExact用于多种格式。列出你想要的每种格式可能会有点乏味,但这样你就可以明确它了。

MSDN documentation

以下代码是使用两种格式的简单,人为的示例。我使用的是美国文化,但您可以根据需要替换自己的文化(或不变的文化)。

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());