0
votes

String to DateTime, Tryparse n'était pas suffisant

Voici une méthode qui fonctionne:

        /// <summary>
        /// Checks date validity.
        /// </summary>
        /// <param name="candidate">String to check</param>
        /// <returns>Whether valid and result as a date</returns>
        private static Tuple<bool, DateTime?> ParseDate(string candidate)
        {
            DateTime result;
            if(DateTime.TryParseExact(candidate, "dd.MM.yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out result) ||
                DateTime.TryParseExact(candidate, "dd.M.yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out result) ||
                DateTime.TryParseExact(candidate, "dd.MM.yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out result) ||
                DateTime.TryParseExact(candidate, "d.M.yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out result) ||
                DateTime.TryParseExact(candidate, "dd/MM/yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out result) ||
                DateTime.TryParseExact(candidate, "dd/M/yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out result) ||
                DateTime.TryParseExact(candidate, "dd/MM/yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out result) ||
                DateTime.TryParseExact(candidate, "d/M/yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out result) ||
                DateTime.TryParseExact(candidate, "dd.MM.yy", CultureInfo.InvariantCulture, DateTimeStyles.None, out result) ||
                DateTime.TryParseExact(candidate, "dd.M.yy", CultureInfo.InvariantCulture, DateTimeStyles.None, out result) ||
                DateTime.TryParseExact(candidate, "dd.MM.yy", CultureInfo.InvariantCulture, DateTimeStyles.None, out result) ||
                DateTime.TryParseExact(candidate, "d.M.yy", CultureInfo.InvariantCulture, DateTimeStyles.None, out result) ||
                DateTime.TryParseExact(candidate, "dd/MM/yy", CultureInfo.InvariantCulture, DateTimeStyles.None, out result) ||
                DateTime.TryParseExact(candidate, "dd/M/yy", CultureInfo.InvariantCulture, DateTimeStyles.None, out result) ||
                DateTime.TryParseExact(candidate, "dd/MM/yy", CultureInfo.InvariantCulture, DateTimeStyles.None, out result) ||
                DateTime.TryParseExact(candidate, "d/M/yy", CultureInfo.InvariantCulture, DateTimeStyles.None, out result)
            )
            {
                return new Tuple<bool, DateTime?>(true, result);
            }

            return new Tuple<bool, DateTime?>(false, null);
        }


4 commentaires

Avez-vous juste essayé d'analyser la culture appropriée? Il semble que "dd.m.yyyy" aurait dû faire le tour - l'avez-vous essayé dans un débogueur? Si vous voulez vraiment utiliser toutes ces chaînes de format, mettez-les dans une collection et utilisez un pourach (vous aurez besoin de réorganiser votre logique, mais cela ne devrait pas être si difficile). Ce code fonctionne pour moi ( DateTime.trySeexact (candidat, "dd.m.yyyy", cultureinfo.invariantculture, dentetimestyle.none, résultat de var); ) avec une entrée de var candidat = "15.6.2020"; . Vous apprécierez l'utilisation - les gens ici insistent ici pour mettre le numéro de mois d'abord.


Ouais je n'ai pas remarqué ça. bon point. mal supprimer mon commentaire


Envisagez de fractionnement de la chaîne dans ses trois composants et d'appeler docs.microsoft.com/en-us/dotnet/api/... . Vous aurez peut-être besoin de code spécial pour gérer des années à 2 chiffres.


Je pensais que denttime.tryparse le ferait, mais il a réussi à échouer en quelque sorte avec 15.6.2020 (le lundi passé) et retournerait que ce n'est pas une date valide. S'il vous plaît montrez-nous ce code.


3 Réponses :


2
votes

Il existe de nombreux formats de date et certains sont personnalisés, c'est pourquoi vous devez spécifier quel format valide vous accepterez. Il sera utile que vous puissiez valider le format ou limiter le format accepté dans l'interface utilisateur (si la date provient d'une sorte d'entrée manuelle). Dans DateTime.TrySeExact, une surcharge accepte une gamme de formats de chaîne Voir ici


0 commentaires

0
votes

Utilisez une expression régulière pour correspondre au format de la chaîne. Quelque chose comme xxx


0 commentaires

0
votes

Garder votre même logique, j'ai écrit ceci: xxx

accompagné de votre liste de formats de date. Ensuite, je l'ai continue de les éliminer jusqu'à ce que j'avais un ensemble minimal: xxx

puis j'ai écrit un petit harnais de test qui ressemble à: xxx

et a obtenu ce résultat (je suis aux États-Unis, nous utilisons donc le format d'année mensuel insensé par défaut): xxx

qui semble un peu moins fou.


0 commentaires