8
votes

DateTime.Parse jette toujours une exception dans une culture spécifique

J'ai des vieux fichiers journaux que je dois analyser - apparemment la date de la date a été enregistrée comme suit: 18/12/2012 11:09:39 P.M. - Toutes mes tentatives d'analyse ont échoué. Je suis complètement perdu sur cela - toute aide ou direction serait géniale!

 CultureInfo cultureInfo = new CultureInfo( "es-MX" , true );
        string date = "18/12/2012 11:09:39 p.m.";

        DateTime dt = new DateTime( 2012 , 12 , 18 , 11 , 9 , 39 ).AddHours( 12 );

        this.richTextBox1.Text += date + Environment.NewLine;
        this.richTextBox1.Text += dt.ToString( cultureInfo ) + Environment.NewLine;
        this.richTextBox1.Text += dt.ToString() + Environment.NewLine;

        foreach ( var item in richTextBox1.Lines )
        {
            try
            {
               DateTime d=  DateTime.Parse( item );
               this.richTextBox1.Text += d.ToString() + Environment.NewLine ;

            }
            catch ( Exception ee)
            {
                this.richTextBox1.Text += ee.Message + Environment.NewLine ;

            }
        }


7 commentaires

TOUJOURS ... Eh bien ... dans une culture spécifique. +1


Vous attrapez l'exception, non? Qu'est-ce que c'est?


50% du temps, mon code fonctionne 100% du temps.


@Brian pendant quelques secondes après avoir lu votre commentaire, je fais que c'était le commentaire de l'Op ... Wow ..


@Brian extra lolz supposant que votre nom de famille est Fontana.


'ERM DateTime.Parse (article, cultureInfo) peut-être ..


L'exception est: la chaîne n'a pas été reconnue comme une date d'heure valide.


4 Réponses :


2
votes

Essayez d'utiliser denttime.trypseexact (). Voici un exemple que j'ai couru à Linqpad. XXX


2 commentaires

Cela échoue aussi - pas différent du code que j'ai posté .... d = {1/1/1/0001 12:00:00 AM} - Je suppose que la trypairs échoue ...


@BillyDVD Il suffit de copier, collé et couru dans Linqpad et il a couru correctement. Essayez de faire ça.



0
votes

Essayez d'utiliser votre variable de cultureInfo comme deuxième paramètre d'analyse. Cela utilisera la culture comme fournisseur de format. xxx


3 commentaires

@Nicholas - Malheureusement, je n'ai pas étendu les commentaires sous la question initiale avant de soumettre. Tony Hopkinson l'a posté avant nous deux.


Ajout de cela donne l'exception: la chaîne n'a pas été reconnue comme une date d'heure valide. Il y a un mot inconnu à partir de l'index 20.


Sommes-vous toujours simplement analysant cet exemple ou essayez-vous d'analyser les fichiers journaux que vous travaillez?



0
votes

Le problème est que vous ne spécifiez pas la culture à utiliser dans votre appel à analyser (). Votre invocation utilise la propriété actuelle du fil actuel:

CultureInfo mexico = CultureInfo.GetCultureInfo( "es-MX" );
Thread.CurrentThread.CurrentCulture = mexico;


2 commentaires

Produit toujours l'exception: la chaîne n'a pas été reconnue comme une date d'heure valide. Il y a un mot inconnu à partir de l'index 20.


@BillyDVD, avez-vous vérifié les caractères réels dans la chaîne de défaillance? Le décalage +20 dans votre chaîne d'échantillon est la minuscule «P» dans p.m. . Je suis prêt à être que vous avez de mauvaises données quelque part. Avez-vous plusieurs espaces intégrés dans la chaîne? Vous voudrez peut-être vous détendre la manipulation de WhitSpace avec l'une des surcharges () qui prend en charge la spécification de DateTimeMestyle .



3
votes

Certaines dates sont correctes dans le ou les fichiers journaux que certains ont le formatage impair qui se termine par p. m. ou p.m .. Toutes les méthodes ci-dessus semblent échouer - et oui je les ai essayés tous :( C'était mon hack / solution pour le problème:

     CultureInfo cultureInfo = new CultureInfo( "es-MX" , true );
     Date = DateTime.Parse( date.Replace( "p. m." , "PM" ).Replace( "p.m." , "PM" ).Replace( "." , "" ).ToUpper() , cultureInfo );


0 commentaires