TryParseExact没有收到有效的格式c#

时间:2014-04-16 12:10:36

标签: c# datetime

我正在尝试从控制台输入日期时间值。但是,TryParseExact方法不接收有效格式:

string startdate;
DateTime inputDate;
while (true)
{
   Console.WriteLine("Input time [HH:MM TT]");
   startdate = Console.ReadLine();
   if (DateTime.TryParseExact(startdate, "hh:mm tt",
                              CultureInfo.CurrentCulture,
                              DateTimeStyles.None, out inputDate))
   {
      break;
   }
}

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

如果它不接受您认为有效的输入,则有两个可能的原因导致问题:

1)输入不是你想象的那样。这可能是由于从包含无效字符或其他内容的其他位置复制和粘贴引起的。如果您手动输入数字,那么这不太可能是一个问题。

2)您接受的格式不是您认为的格式。这很可能是因为有些细微之处可能会让你感到害怕。关键的想法是查找http://msdn.microsoft.com/en-us/library/8kb3ddd4(v=vs.110).aspx中的所有内容,并注意您使用的几个元素都依赖于文化。你显然至少部分地意识到文化,因为你明确表示你想要当前的文化。虽然很难说输入应该是什么,但不知道这种文化是什么。

一个典型的例子是,您的格式:并不代表字面冒号,而是"时间分隔符"。引用MSDN页面:"":"自定义格式说明符表示时间分隔符,用于区分小时,分钟和秒。从当前或指定区域性的DateTimeFormatInfo.TimeSeparator属性中检索适当的本地化时间分隔符。"

正如您所看到的,这意味着它并非总是:

通常最好的解决方法,特别是因为你很难确定格式,是使用CultureInfo.InvariantCulture,这将保证不会改变,具体取决于你运行软件的位置等。否则你应该生成指定使用当前文化对象的相关组件更正输入。

答案 1 :(得分:0)

如何在没有white(true)循环/的情况下编写此代码的示例,以尝试让您的用户更轻松:

string startdate;
DateTime inputDate;
while (inputDate == null)
{
    Console.WriteLine("Input time [HH:MM TT]");
    startdate = Console.ReadLine();
    if (!DateTime.TryParseExact
    (
        startdate, "hh:mm tt"
        ,CultureInfo.CurrentCulture
        ,DateTimeStyles.None
        , out inputDate
    ))
    {
        Console.WriteLine(String.Format("'{0}' is an invalid value."));
        //http://msdn.microsoft.com/en-us/library/8kb3ddd4(v=vs.110).aspx
        Console.WriteLine(
            String.Format("Example: The time now is '{0}'"
            ,DateTime.Now.ToString("hh:mm tt", CultureInfo.CurrentCulture))
        );
    }
}
Console.WriteLine("That's a valid time :)");

注意:上面的代码可以在给定正确输入(对于用户当前文化)的情况下工作,代码退出循环。