2009-12-08 15 views
9

Quando si tenta di utilizzare il metodo Parse della classe DateTime ottengo un eccezione generata:.NET DateTime.Parse

stringa non è stata riconosciuta come DateTime valido.

  • La stringa si legge come "26/10/2009 8:47:39 AM" quando in uscita.
  • Questa stringa è ottenuta da un gruppo su una corrispondenza da un'espressione regolare.
  • Nessuna delle stringhe ottenute da questo gruppo di corrispondenza verrà analizzata in data/ora. (WTF?)

Esempi di altre stringhe:

 
26/10/2009 8:47:39 AM 
26/10/2009 8:00:41 AM 
26/10/2009 7:48:35 AM 

La cosa strana è, sono sicuro che ha lavorato prima >__<

+0

Le impostazioni internazionali in Windows sono impostate correttamente? –

+0

Sì, ma l'applicazione era in esecuzione come servizio e il profilo dell'utente che esegue il servizio non lo ha fatto. :) – Matthew

risposta

11

Parse prende in considerazione le impostazioni internazionali (cultura del thread corrente). Pertanto, vorrei usare ParseExact e specificare il formato corretto in modo esplicito con una cultura invariabile (o la cultura di cui hai bisogno, ad esempio en-US, per AM/PM).

2

il culure è cambiato sulla macchina? 26/10/2009 è una buona data del Regno Unito ma una data negativa per gli Stati Uniti (ad esempio)

+0

Questo mi era appena venuto in mente. Datetime.parse sembra avere un sovraccarico per il formato dell'ora culturale. Sto solo cercando di scoprire come usarlo ora :) Grazie per il tuo aiuto. – Matthew

2

O chiamare DateTime.Parse() con la coltura come parametro o chiamare DateTime.ParseExact() con la data, il formato esatto della data da analizzare, e la cultura:

DateTime.ParseExact()

24

L'analisi delle stringhe nell'oggetto DateTime è quasi sempre un problema. Se si sa per certo che avranno sempre il formato come i vostri esempi fanno, questo dovrebbe funzionare:

string input = "26/10/2009 8:00:41 AM"; 
DateTime dateTime = DateTime.ParseExact(input, "dd/MM/yyyy h:mm:ss tt", CultureInfo.InvariantCulture); 
+0

Stavo scrivendo esattamente questa stessa risposta. –

+0

Anche se stavo per aggiungere alcune informazioni sulle impostazioni regionali (globalizzazione) che influiscono sull'analisi della data. –

+0

@Vinko: anch'io. È la parte del dolore. ;) No, sul serio, è un'area piuttosto complessa che è una fonte di problemi comuni. Ho scritto una sorta di risposta lenta sull'argomento qualche tempo fa qui: http://stackoverflow.com/questions/1437454/date-format-problem –

3

Probabilmente stai usando la cultura sbagliata. Il mese non può essere 26, quindi non è un timestamp negli Stati Uniti. Questo funziona però:

using System; 
using System.Globalization; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     DateTime dateTime = DateTime.Parse("26/10/2009 8:47:39 AM", 
      CultureInfo.GetCultureInfo("en-GB")); 
    } 
} 
1

I secondi @Lucero, Parse utilizza informazioni cultura del thread corrente ecc Vedi anche nella direzione opposta: un ToStringquestion in questo contesto.

Problemi correlati