2013-04-19 9 views
8

Ho alcuni vecchi file di registro che devo analizzare - apparentemente l'ora è stata salvata come: 18/12/2012 11:09:39 p.m. - Tutti i miei tentativi di analizzare questi hanno fallito. Sono completamente perso su questo - Qualsiasi aiuto o direzione sarebbe fantastico!DateTime.Parse genera sempre un'eccezione in una coltura specifica

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 ; 

      } 
     } 
+1

** ** SEMPRE ... beh ... in una cultura specifica +1 – phadaphunk

+1

volete prendere l'eccezione, a destra cos'è –

+1

50% del t.?? lui tempo, il mio codice funziona al 100% del tempo. – Brian

risposta

3

Alcune date sono corrette nei file di registro alcuni hanno la formattazione dispari che finisce in pm o pm Tutti i metodi sopra sembrano fallire - e sì li ho provati tutti :( Questo era il mio hack/fix per il problema:

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

Provare a utilizzare DateTime.TryParseExact(). Ecco un esempio che ho eseguito su LINQPad.

void Main() 
{ 
    System.Globalization.CultureInfo cultureInfo = new System.Globalization.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); 

    DateTime d; 
    string[] styles = {"dd/MM/yyyy hh:mm:ss tt"}; // This doesn't have to be an array - could be string 
    DateTime.TryParseExact(date, styles, cultureInfo, System.Globalization.DateTimeStyles.None, out d); 

    d.Dump(); 
} 
+0

Anche questo non funziona - non è diverso dal codice che ho postato .... d = {1/1/0001 12:00:00 AM} - Immagino che il tryparse stia fallendo ... – BillyDvd

+0

@BillyDvd Basta copiare, incollare e eseguito in LINQPad e funzionava correttamente. Prova a farlo. –

0

Provare a utilizzare la variabile cultureInfo come secondo parametro di Parse. Questo utilizzerà la cultura come fornitore di formati.

DateTime d = DateTime.Parse(item, cultureInfo); 
+0

Le grandi menti pensano allo stesso modo! –

+0

@Nicholas - sfortunatamente non ho ampliato i commenti sotto la domanda originale prima di inviarlo. Tony Hopkinson lo ha pubblicato prima di entrambi. – Dave

+0

L'aggiunta di questo dà l'eccezione: la stringa non è stata riconosciuta come un DateTime valido. C'è una parola sconosciuta che inizia dall'indice 20. – BillyDvd

0

Il problema è che non si specifica la lingua da utilizzare nella chiamata a Parse(). La vostra invocazione utilizza proprietà CurrentCulture del thread corrente:

DateTime d= DateTime.Parse(item); 

L'incantesimo magico che vi serve è qualcosa di simile:

DateTime instance = DateTime.Parse(text , CultureInfo.GetCultureInfo("es-MX")) ; 

tua altra alternativa è quella di cambiare la cultura del thread corrente:

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

prima di chiamare DateTime.Parse(). Fallo all'avvio e dovresti essere bravo a farlo (a patto che lavorare in spagnolo messicano sia utile per i tuoi scopi. Nota che cambiare la cultura attuale non cambierà il modo in cui vengono visualizzate le cose: questa è la responsabilità della proprietà CurrentUICulture del thread

+0

Ancora produce l'eccezione: La stringa non è stata riconosciuta come un DateTime valido. C'è una parola sconosciuta che inizia dall'indice 20. – BillyDvd

+0

@BillyDvd, hai controllato quali sono i caratteri reali nella stringa fallita? l'offset +20 nella stringa campione è la "p" minuscola in "p.m". Sono disposto ad essere che hai dati cattivi da qualche parte. Avete più spazi incorporati nella stringa?Potresti voler rilassare la gestione degli spazi bianchi con uno dei sovraccarichi 'Parse()' che supporta la specifica di 'DateTimeStyles'. –

Problemi correlati