您需要使用ParseExact
方法。这将字符串作为第二个参数,该字符串指定datetime的格式,例如:
dateString = "2011-29-01 12:00 am";
format = "yyyy-dd-MM h:mm tt";
try
{
result = DateTime.ParseExact(dateString, format, provider);
Console.WriteLine("{0} converts to {1}.", dateString, result.ToString());
}
catch (FormatException)
{
Console.WriteLine("{0} is not in the correct format.", dateString);
}
如果用户可以在UI中指定格式,则需要将其转换为可以传递给此方法的字符串。您可以通过允许用户直接输入格式字符串来做到这一点-尽管这意味着转换很可能会失败,因为他们将输入无效的格式字符串-或具有一个组合框为用户提供可能的选择,并且设置这些选项的格式字符串。
如果输入可能不正确(例如用户输入),则最好使用TryParseExact
而不是使用异常来处理错误情况:
dateString = "2011-29-01 12:00 am";
format = "yyyy-dd-MM h:mm tt";
DateTime result;
if (DateTime.TryParseExact(dateString, format, provider, DateTimeStyles.None, out result))
{
Console.WriteLine("{0} converts to {1}.", dateString, result.ToString());
}
else
{
Console.WriteLine("{0} is not in the correct format.", dateString);
}
更好的替代方法可能是不为用户提供日期格式的选择,而是使用采用一系列格式的重载:
string[] formats= {"M/d/yyyy h:mm:ss tt", "M/d/yyyy h:mm tt",
"MM/dd/yyyy hh:mm:ss", "M/d/yyyy h:mm:ss",
"M/d/yyyy hh:mm tt", "M/d/yyyy hh tt",
"M/d/yyyy h:mm", "M/d/yyyy h:mm",
"MM/dd/yyyy hh:mm", "M/dd/yyyy hh:mm",
"MM/d/yyyy HH:mm:ss.ffffff" };
string dateString;
try
{
dateValue = DateTime.ParseExact(dateString, formats,
new CultureInfo("en-US"),
DateTimeStyles.None);
Console.WriteLine("Converted '{0}' to {1}.", dateString, dateValue);
}
catch (FormatException)
{
Console.WriteLine("Unable to convert '{0}' to a date.", dateString);
}
如果您从配置文件或数据库中读取可能的格式,则可以在遇到人们想要输入日期的所有不同方式时将其添加到其中。
TryParse
。那是bool success = DateTime.TryParse(...);
。