J'ai la date suivante au format de chaîne "2011-29-01 12:00 am". Maintenant, j'essaye de convertir cela au format datetime avec le code suivant:
DateTime.TryParse(dateTime, out dt);
Mais je suis toujours en train de prendre la forme de {1/1/0001 12:00:00 AM}, pouvez-vous me dire pourquoi? et comment puis-je convertir cette chaîne à la date.
EDIT: Je viens de voir tout le monde a mentionné d'utiliser l'argument de format. Je mentionnerai maintenant que je ne peux pas utiliser le paramètre format car je dispose de certains paramètres pour sélectionner le format de date personnalisé que l'utilisateur souhaite et, sur la base de cet utilisateur, il est capable d'obtenir la date dans la zone de texte dans ce format automatiquement via jQuery datepicker.
Cela devrait fonctionner sur la base de votre exemple "2011-29-01 12:00"
DateTime dt;
DateTime.TryParseExact(dateTime,
"yyyy-dd-MM hh:mm tt",
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out dt);
Vous devez utiliser la méthode ParseExact
. Cela prend comme second argument une chaîne spécifiant le format dans lequel se trouve l'heure de la date et heure, 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 que vous pouvez transmettre à cette méthode. Vous pouvez le faire en autorisant l’utilisateur à saisir directement la chaîne de format - bien que cela signifie que la conversion échouera probablement car ils le sera saisiront une chaîne de format non valide - ou en disposant d’une liste déroulante. cela leur présente les choix possibles et vous configurez les chaînes de format pour ces choix.
S'il est probable que l'entrée sera incorrecte (entrée utilisateur par exemple), il serait préférable d'utiliser 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 ne pas présenter à l'utilisateur un choix de formats de date, mais utiliser la 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 dans un fichier de configuration ou dans une base de données, vous pouvez les ajouter au fur et à mesure que vous rencontrez les différentes manières pour les utilisateurs de saisir des dates.
Essayez d'utiliser la méthode sécurisée TryParseExact
DateTime temp;
string date = "2011-29-01 12:00 am";
DateTime.TryParseExact(date, "yyyy-dd-MM hh:mm tt", CultureInfo.InvariantCulture, DateTimeStyles.None, out temp);
De DateTime sur msdn:
Type: System.DateTime% Lorsque cette méthode est renvoyée, contient la valeur DateTime équivalente à la date et l'heure contenues dans s, si la conversion a réussi, ou MinValue si la conversion a échoué . La conversion échoue si le paramètre s est null, s'il s'agit d'une chaîne vide ("") ou ne contient pas une représentation sous forme de chaîne valide d'une date et d'une heure. Ce paramètre est passé non initialisé.
Utilisez parseexact avec la chaîne de format "yyyy-dd-MM hh:mm tt"
au lieu.
Ça marche:
DateTime dt = DateTime.ParseExact("2011-29-01 12:00 am", "yyyy-dd-MM hh:mm tt", System.Globalization.CultureInfo.InvariantCulture);
DateTime dt = DateTime.ParseExact("11-22-2012 12:00 am", "MM-dd-yyyy hh:mm tt", System.Globalization.CultureInfo.InvariantCulture);
Si vous donnez à l'utilisateur la possibilité de changer le format de date/heure, vous devrez créer une chaîne de format correspondante à utiliser pour l'analyse. Si vous connaissez les formats de date possibles (c’est-à-dire que l’utilisateur doit faire son choix dans une liste), cela est beaucoup plus facile car vous pouvez créer ces chaînes de format au moment de la compilation.
Si vous laissez l'utilisateur créer un format libre du format date/heure, vous devrez alors créer les chaînes de formatage DateTime
correspondantes au moment de l'exécution.