Necesitas usar el ParseExact
método . Esto toma una cadena como segundo argumento que especifica el formato en el que se encuentra la fecha y hora, por ejemplo:
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);
}
Si el usuario puede especificar un formato en la interfaz de usuario, entonces debe traducirlo a una cadena que pueda pasar a este método. Puede hacerlo por cualquiera de permitir que el usuario introduzca la cadena de formato directamente - aunque esto significa que la conversión es más probable que falle a medida que se introduce una cadena de formato no válido - o tener un cuadro combinado que les presenta las posibles opciones y le configure las cadenas de formato para estas opciones.
Si es probable que la entrada sea incorrecta (la entrada del usuario, por ejemplo), sería mejor usar en TryParseExact
lugar de usar excepciones para manejar el caso de error:
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);
}
Una mejor alternativa podría ser no presentarle al usuario una opción de formatos de fecha, sino usar la sobrecarga que toma una variedad de formatos :
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);
}
Si lee los posibles formatos de un archivo de configuración o una base de datos, puede agregarlos a medida que encuentre las diferentes formas en que las personas desean ingresar fechas.
TryParse
. Eso esbool success = DateTime.TryParse(...);
.