我正在尝试从控制台输入日期时间值。然而,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;
}
}
有什么建议吗?
如果它不接受您认为有效的输入,那么问题可能有两个原因:
1) 输入不是你想象的那样。这可能是由于从其他地方复制和粘贴包含无效字符或其他内容造成的。如果您是手动键入数字,那么这不太可能是一个问题。
2) 你所接受的格式并不是你想象的那样。这很可能是因为有一些微妙之处会影响你。关键思想是在http://msdn.microsoft.com/en-us/library/8kb3ddd4(v=vs.110).aspx,并注意您正在使用的几个元素依赖于区域性。很明显,你至少部分了解文化,因为你明确表示你想要当前的文化。在不知道这种文化是什么的情况下,尽管很难说输入应该是什么
一个恰当的例子是,在您的格式中,:
的意思不是字面上的冒号,而是"时间分隔符"。引用MSDN页面:":"自定义格式说明符表示时间分隔符,用于区分小时、分钟和秒。从当前或指定区域性的DateTimeFormatInfo.TimeSeparator属性中检索适当的本地化时间分隔符。"
正如您所看到的,这意味着它并不总是:
。
通常,最好的解决方案是使用CultureInfo.InvariantCulture
,这将保证不会根据您运行软件的位置等而更改,尤其是在您难以定义格式的情况下。否则,您应该使用当前区域性对象的相关组件生成指定正确输入的字符串。
如何在不使用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 :)");
注意:如果输入正确(对于用户当前的文化),上面的代码就会退出循环。