Vous devez utiliser le ParseExact
méthode . Il prend comme second argument une chaîne de caractères qui spécifie le format de la date, par exemple :
// Parse date and time with custom specifier.
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 l'utilisateur peut spécifier un format dans l'interface utilisateur, vous devez le traduire en une chaîne de caractères que vous pouvez passer dans cette méthode. Pour ce faire, vous pouvez soit permettre à l'utilisateur d'entrer directement la chaîne de format - bien que cela signifie que la conversion a plus de chances d'échouer car l'utilisateur n'est pas en mesure d'entrer la chaîne de format. sera saisir une chaîne de format non valide - ou avoir une boîte combo qui leur présente les choix possibles et vous configurez les chaînes de format pour ces choix.
S'il est probable que la saisie soit incorrecte (saisie de l'utilisateur par exemple), il est préférable d'utiliser la méthode suivante TryParseExact
plutôt que d'utiliser des exceptions pour gérer le cas d'erreur :
// Parse date and time with custom specifier.
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);
}
Une meilleure alternative pourrait être de no présentent à l'utilisateur un choix de formats de date, mais utilisent l'option surcharge qui prend un tableau de formats :
// A list of possible American date formats - swap M and d for European formats
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; // The string the date gets read into
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 vous lisez les formats possibles à partir d'un fichier de configuration ou d'une base de données, vous pouvez les compléter au fur et à mesure que vous rencontrez les différentes façons dont les gens veulent saisir les dates.
4 votes
À propos, vous pouvez déterminer si la conversion a échoué en vérifiant la valeur de retour de la fonction
TryParse
. C'est-à-direbool success = DateTime.TryParse(...);
.